Ver Mensaje Individual
  #6 (permalink)  
Antiguo 31/05/2013, 11:28
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Seleccionar desde una fecha hacia abajo

Hola Dylanrv:

A ver si entendí bien... según yo lo que quieres hacer es lo siguiente.

1. Extraer de una tabla los registros comprendidos entre dos fechas.
2. Si entre las dos fechas existen más de 12 registros, entonces traer los más cercanos a la primer fecha.
3. Si entre las dos fechas existen exactamente 12 registros, entonces traer esos 12 registros.
4. Si entre las dos fechas existen menos de 12 registros, completar los 12 registros con aquellos que se acerquen más a la fecha inferior, no importa que no se encuentren dentro del rango de las dos fechas.

Si estoy correcto en el planteamiento, creo que podrías hacerlo así:

Código MySQL:
Ver original
  1. (
  2.   ( SELECT * FROM tabla
  3.     WHERE fecha BETWEEN @fechaInferior AND @fechaSuperior
  4.     ORDER BY fecha LIMIT 12)
  5.     UNION
  6.   ( SELECT *
  7.     FROM tabla
  8.     WHERE fecha <= @fechaSuperior
  9.     ORDER BY fecha DESC LIMIT 12)
  10. ) T
  11. ORDER BY fecha LIMIT 12;

Veamos algunos ejemplos... supongamos que tenemos los siguientes datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+------------+
  3. | id   | fecha      |
  4. +------+------------+
  5. |    1 | 2013-05-01 |
  6. |    2 | 2013-05-02 |
  7. |    3 | 2013-05-03 |
  8. |    4 | 2013-05-04 |
  9. |    5 | 2013-05-05 |
  10. |    6 | 2013-05-06 |
  11. |    7 | 2013-05-07 |
  12. |    8 | 2013-05-08 |
  13. |    9 | 2013-05-09 |
  14. |   10 | 2013-05-10 |
  15. |   11 | 2013-05-11 |
  16. |   12 | 2013-05-12 |
  17. |   13 | 2013-05-13 |
  18. |   14 | 2013-05-14 |
  19. |   15 | 2013-05-15 |
  20. |   16 | 2013-05-16 |
  21. +------+------------+
  22. 16 rows in set (0.00 sec)

Si ponemos como fechas los dos límites (2013-05-01 y 2013-05-16), existen 16 registros, el resultado deberá mostrar los primeros 12:

Código MySQL:
Ver original
  1. mysql> SET @fechaInferior = '2013-05-01';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SET @fechaSuperior = '2013-05-16';
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> SELECT * FROM
  8.     -> (
  9.     ->   ( SELECT * FROM tabla
  10.     ->     WHERE fecha BETWEEN @fechaInferior AND @fechaSuperior
  11.     ->     ORDER BY fecha LIMIT 12)
  12.     ->     UNION
  13.     ->   ( SELECT *
  14.     ->     FROM tabla
  15.     ->     WHERE fecha <= @fechaSuperior
  16.     ->     ORDER BY fecha DESC LIMIT 12)
  17.     -> ) T
  18.     -> ORDER BY fecha LIMIT 12;
  19. +------+------------+
  20. | id   | fecha      |
  21. +------+------------+
  22. |    1 | 2013-05-01 |
  23. |    2 | 2013-05-02 |
  24. |    3 | 2013-05-03 |
  25. |    4 | 2013-05-04 |
  26. |    5 | 2013-05-05 |
  27. |    6 | 2013-05-06 |
  28. |    7 | 2013-05-07 |
  29. |    8 | 2013-05-08 |
  30. |    9 | 2013-05-09 |
  31. |   10 | 2013-05-10 |
  32. |   11 | 2013-05-11 |
  33. |   12 | 2013-05-12 |
  34. +------+------------+
  35. 12 rows in set (0.00 sec)

Si ponemos como limites (2013-05-03 y 2013-05-14), existen EXACTAMENTE 12 REGISTROS, por lo tanto muestra esos:

Código MySQL:
Ver original
  1. mysql> SET @fechaInferior = '2013-05-03';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SET @fechaSuperior = '2013-05-14';
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> SELECT * FROM
  8.     -> (
  9.     ->   ( SELECT * FROM tabla
  10.     ->     WHERE fecha BETWEEN @fechaInferior AND @fechaSuperior
  11.     ->     ORDER BY fecha LIMIT 12)
  12.     ->     UNION
  13.     ->   ( SELECT *
  14.     ->     FROM tabla
  15.     ->     WHERE fecha <= @fechaSuperior
  16.     ->     ORDER BY fecha DESC LIMIT 12)
  17.     -> ) T
  18.     -> ORDER BY fecha LIMIT 12;
  19. +------+------------+
  20. | id   | fecha      |
  21. +------+------------+
  22. |    3 | 2013-05-03 |
  23. |    4 | 2013-05-04 |
  24. |    5 | 2013-05-05 |
  25. |    6 | 2013-05-06 |
  26. |    7 | 2013-05-07 |
  27. |    8 | 2013-05-08 |
  28. |    9 | 2013-05-09 |
  29. |   10 | 2013-05-10 |
  30. |   11 | 2013-05-11 |
  31. |   12 | 2013-05-12 |
  32. |   13 | 2013-05-13 |
  33. |   14 | 2013-05-14 |
  34. +------+------------+
  35. 12 rows in set (0.00 sec)

Si ponemos como limites (2013-05-10 y 2013-05-16) sólo existen 7 registros, por lo que se mostrarán esos 7 registros más los 5 registros más cercanos al límite inferior:

Código MySQL:
Ver original
  1. mysql> SET @fechaInferior = '2013-05-10';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SET @fechaSuperior = '2013-05-16';
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> SELECT * FROM
  8.     -> (
  9.     ->   ( SELECT * FROM tabla
  10.     ->     WHERE fecha BETWEEN @fechaInferior AND @fechaSuperior
  11.     ->     ORDER BY fecha LIMIT 12)
  12.     ->     UNION
  13.     ->   ( SELECT *
  14.     ->     FROM tabla
  15.     ->     WHERE fecha <= @fechaSuperior
  16.     ->     ORDER BY fecha DESC LIMIT 12)
  17.     -> ) T
  18.     -> ORDER BY fecha LIMIT 12;
  19. +------+------------+
  20. | id   | fecha      |
  21. +------+------------+
  22. |    5 | 2013-05-05 |
  23. |    6 | 2013-05-06 |
  24. |    7 | 2013-05-07 |
  25. |    8 | 2013-05-08 |
  26. |    9 | 2013-05-09 |
  27. |   10 | 2013-05-10 |
  28. |   11 | 2013-05-11 |
  29. |   12 | 2013-05-12 |
  30. |   13 | 2013-05-13 |
  31. |   14 | 2013-05-14 |
  32. |   15 | 2013-05-15 |
  33. |   16 | 2013-05-16 |
  34. +------+------------+
  35. 12 rows in set (0.00 sec)

Espero que esto sea más o menos lo que esperas... si no es así, trata de explicar con datos, tal como lo he hecho qué es lo que esperas como salidas.

Saludos
Leo.