Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Seleccionar desde una fecha hacia abajo

Estas en el tema de Seleccionar desde una fecha hacia abajo en el foro de Mysql en Foros del Web. Hola, quería saber si es posible ya que me trae de cabeza, hacer que seleccione desde un valor que le paso hasta llegar a un ...
  #1 (permalink)  
Antiguo 30/05/2013, 09:07
 
Fecha de Ingreso: marzo-2013
Mensajes: 23
Antigüedad: 11 años, 8 meses
Puntos: 0
Seleccionar desde una fecha hacia abajo

Hola, quería saber si es posible ya que me trae de cabeza, hacer que seleccione desde un valor que le paso hasta llegar a un límite de 12.

Código MySQL:
Ver original
  1. SELECT DISTINCT t.idtrabajo,t.nalbaran,t.nacta,t.matriculacamio,t.datamuestra,t.dataensayo,t.rconsistencia,t.rresistencia,t.cconsistencia,t.cresistencia,p.codigo,p.resistencia,t.pdf
  2.                 FROM trabajo t, producto p, laboratori l, plantas_has_laboratoris phl".$from_usuari."
  3.                 WHERE t.idproducto = p.idproducto              
  4.                 AND phl.idlaboratorio = l.idlaboratori
  5.                 AND phl.tipo='Verificación'
  6.                 AND t.idlaboratorio = l.idlaboratori
  7.                 AND t.idplanta = ".$idPlanta."
  8.                  ".$clausula_prod."
  9.                 ".$clausula_lab."
  10.                 ".$clausula_usuari."
  11.                 AND t.datamuestra < '".$anyof."-".$mesf."-".$diaf."'
  12.                 AND DATEDIFF(t.dataensayo,t.datamuestra) BETWEEN 27 AND 30
  13.                 ORDER BY t.datamuestra DESC
  14.                 LIMIT 12

La parte en negrita lo que hace es limitarme a que coja los que sean menores que esa fecha, pero como tengo más de 12 valores nunca llega a cumplirse. Mi pregunta es, puedo hacer que a partir de '".$anyof."-".$mesf."-".$diaf."' coja los inferiores hasta llegar a 12 en vez de al reves? Gracias :)

PD: Espero que se me haya entendido, lo que yo quiero es que, pongamos que tenemos estos datos
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 cada dato con su fecha. Yo introduzco 2 fechas en la sentencia y delimito, si hay 12 valores (por ejemplo del 2 al 14)comprendidos en las fechas que pongo está bien, pero si hay menos (del 4 al 14) necesito que coja los dos ANTERIORES y NO POSTERIORES, entonces pensé si había alguna manera de hacer partir de base el "14" y ir bajando hasta el "2" porque con lo que hago me coje del "1" al "12" y se deja los 2 últimos valores comprendidos en el la fecha que pongo. Gracias!

Última edición por gnzsoloyo; 30/05/2013 a las 11:25 Razón: SQL mal etiquetado y con codigo de programacion
  #2 (permalink)  
Antiguo 30/05/2013, 11:13
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 23 años
Puntos: 655
Respuesta: Seleccionar desde una fecha hacia abajo

Disculpa pero eso no es MySQL ni SQL estándar. Es realizar esa validación en la programación o un procedimiento almacenado (trigger) en última instancia.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #3 (permalink)  
Antiguo 31/05/2013, 08:42
 
Fecha de Ingreso: marzo-2013
Mensajes: 23
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Seleccionar desde una fecha hacia abajo

Y como podría hacerlo? O en que foro debo postearlo? Gracias!
  #4 (permalink)  
Antiguo 31/05/2013, 09:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Seleccionar desde una fecha hacia abajo

¿Por qué no explicas un poco el sistema, para tratar de ver si existe una solución, o si tienes que cambiar tu método...?
Ten en cuenta que la lógica de procesos y la de datos no necesariamente se resuelven de la misma forma.
Si explicas lo que buscas, podemos ver si el modelo de datos sirve, o si debe hacerse algún cambio para que se pueda cumplir con una consulta en especial.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 31/05/2013, 09:28
 
Fecha de Ingreso: marzo-2013
Mensajes: 23
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Seleccionar desde una fecha hacia abajo

Pues bien, tengo un sistema basado en PHP y MySQL en el que se registran unas pruebas con varias variables entre ellas Fecha Prueba. En un apartado del sistema, clico en hacer informe y delimito la fecha de pruebas que quiero que me exporte a un Excel. El problema está en que, si durante esa fecha no hay 12 pruebas, ha de exportar las que están en ese rango y las que falten para llegar a 12 ANTERIORES a la fecha final, no POSTERIORES, entonces no sé cómo hacerlo... en PHP tengo la consulta para sacar los datos comprendidos entre las fechas y luego hago un recuento, entonces, si es menor de 12, cambio de consulta y he de ejecutar lo que aquí os digo, que coja 12 desde el tiempo que sea, hasta la fecha que pongo.

PD: Espero haber sido más claro, disculpen.
  #6 (permalink)  
Antiguo 31/05/2013, 11:28
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 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.
  #7 (permalink)  
Antiguo 03/06/2013, 07:38
 
Fecha de Ingreso: marzo-2013
Mensajes: 23
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Seleccionar desde una fecha hacia abajo

Gracias por el curro, eres un grande! Sólo hay un detalle, en vez de ser a la fecha anterior, ha de ser a la posterior, es decir, si hay 16 registros ha de sacar los 12 últimos. Probaré cambiando algo de aquí pero de verdad, muchísimas gracias :)

PD: No consigo sacarlo, gracias por la ayuda de verdad pero no puedo sacar los últimos en vez de los primeros...

Última edición por Dylanrv; 03/06/2013 a las 07:47
  #8 (permalink)  
Antiguo 03/06/2013, 07:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Seleccionar desde una fecha hacia abajo

SI la lógica que usas es la que te planeta Leo, entonces el error es de parámetros, y no de consulta.

Postea cómo lo estás intentando. Verlo es más claro que explicarlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 03/06/2013, 07:58
 
Fecha de Ingreso: marzo-2013
Mensajes: 23
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Seleccionar desde una fecha hacia abajo

Código MySQL:
Ver original
  1. -- Consulta 1
  2. SELECT DISTINCT t.idtrabajo,t.nalbaran,t.nacta,t.matriculacamio,t.datamuestra,t.dataensayo,t.rconsistencia,t.rresistencia,t.cconsistencia,t.cresistencia,p.codigo,p.resistencia
  3. FROM trabajo t, producto p, laboratori l, plantas_has_laboratoris phl
  4. WHERE t.idproducto = p.idproducto
  5.     AND phl.idlaboratorio = l.idlaboratori
  6.     AND phl.tipo='Autocontrol'
  7.     AND t.idlaboratorio = l.idlaboratori
  8.     AND t.datamuestra BETWEEN DATE_SUB(date('".$anyof."-".$mesf."-".$diaf."'),INTERVAL 6 MONTH) AND '".$anyof."-".$mesf."-".$diaf."'
  9.     AND t.datamuestra BETWEEN '".$anyoi."-".$mesi."-".$diai."' AND '".$anyof."-".$mesf."-".$diaf."'
  10.     AND t.idplanta = idPlanta
  11.     $clausula_prod
  12.     $clausula_lab
  13.     AND DATEDIFF(t.dataensayo,t.datamuestra) BETWEEN 27 AND 30
  14. ORDER BY t.datamuestra DESC;
  15.  
  16. -- Consulta 2  
  17. SELECT DISTINCT t.idtrabajo, t.nalbaran, t.nacta, t.matriculacamio, t.datamuestra, t.dataensayo, t.rconsistencia, t.rresistencia, t.cconsistencia, t.cresistencia, p.codigo, p.resistencia
  18. FROM trabajo t, producto p, laboratori l, plantas_has_laboratoris phl
  19. WHERE t.idproducto = p.idproducto  
  20.     AND phl.idlaboratorio = l.idlaboratori
  21.     AND phl.tipo='Verificación'
  22.     AND t.idlaboratorio = l.idlaboratori
  23.     AND t.datamuestra BETWEEN DATE_SUB(date('".$anyof."-".$mesf."-".$diaf."'),INTERVAL 6 MONTH) AND '".$anyof."-".$mesf."-".$diaf."'
  24.     AND t.datamuestra BETWEEN '".$anyoi."-".$mesi."-".$diai."' AND '".$anyof."-".$mesf."-".$diaf."' AND t.idplanta = $idPlanta.
  25.     $clausula_prod
  26.     $clausula_lab
  27.     AND DATEDIFF(t.dataensayo,t.datamuestra) BETWEEN 27 AND 30
  28. ORDER BY t.datamuestra DESC
  29.  
  30. --- AQUI EL FALLO
  31. SELECT DISTINCT t.idtrabajo, t.nalbaran, t.nacta, t.matriculacamio, t.datamuestra, t.dataensayo, t.rconsistencia, t.rresistencia, t.cconsistencia, t.cresistencia, p.codigo, p.resistencia,t.pdf
  32. FROM trabajo t, producto p, laboratori l, plantas_has_laboratoris phl".$from_usuari."
  33. WHERE t.idproducto = p.idproducto              
  34.     AND phl.idlaboratorio = l.idlaboratori
  35.     AND phl.tipo='Verificación'
  36.     AND t.idlaboratorio = l.idlaboratori
  37.     AND t.idplanta = ".$idPlanta."
  38.     $clausula_prod
  39.     $clausula_lab
  40.     $clausula_usuari
  41.     AND t.datamuestra < '".$anyof."-".$mesf."-".$diaf."'
  42.     AND DATEDIFF(t.dataensayo,t.datamuestra) BETWEEN 27 AND 30
  43. ORDER BY t.datamuestra DESC
  44. LIMIT 12;

Última edición por gnzsoloyo; 03/06/2013 a las 08:10 Razón: Código de programacion NO PERMITIDO en foros de BBDD.
  #10 (permalink)  
Antiguo 03/06/2013, 08:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Seleccionar desde una fecha hacia abajo

Primer consejo: No postees código de programación en los foros de BBDD. Postea sólo SQL. Las normas del foro de BBDD (incluido este) lo dicen específicamente.

Segundo consejo: El código de SQL con variables de programación incluidas no nos permite saber si la consulta está o no bien construida, o qué resultados pueden variar en la lógica.

Postea las consultas que realmente le llegan a la base, lo que quiere decir que debes capturar la consulta una vez armada con todos sus valores, y antes de que se envíe a MySQL a ejecutar. Todo lo demás no sirve o es engañoso.

En tu caso, es simplemente poner un echo en el lugar adecuado y copiar lo que te muestre la pantalla.

Algunos tips adicionales, sería que no uses la coma como JOIN implícito, ni uses el WHERE para establecer las relaciones. Para eso está el INNER JOIN, ya que el FROM es optimizable y el WHERE no.

Esencialmente, es mejor ver la consulta completa en SQL con los valores reales y no esa maraña de variables cuyo contenido desconocemos. Con eso si se puede analizar, con lo que has puesto... puede haber muchas cosas que no sepamos si están o no corretamente puestas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 03/06/2013, 08:53
 
Fecha de Ingreso: marzo-2013
Mensajes: 23
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Seleccionar desde una fecha hacia abajo

Vale, perdona, creo que sería más fácil decir que todo lo posteado por el compañero es correcto salvo que en vez de cojer los 12 primeros, ha de cojer los 12 últimos, es decir:

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 SEGUNDA 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 MAYOR, no importa que no se encuentren dentro del rango de las dos fechas.

Gracias :)
  #12 (permalink)  
Antiguo 03/06/2013, 09:05
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Seleccionar desde una fecha hacia abajo

Hola de nuevo Dylanrv:

Cita:
Sólo hay un detalle, en vez de ser a la fecha anterior, ha de ser a la posterior, es decir, si hay 16 registros ha de sacar los 12 últimos.
Sinceramente con esta explicación me dejas con más dudas que respuestas ... si esto es lo que quieres ENTONCES DE NADA TE SIRVE MANEJAR UN RANGO DE FECHAS... simplemente con poner la fecha SUPERIOR la consulta debe funcionar como lo pides. mira, chequemos con los datos de ejemplo y con la consulta:

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)

Ahora ponemos las mismas condiciones que puse de ejemplo:

Código:
Si ponemos como fechas los dos límites (2013-05-01 y 2013-05-16), existen 16 registros, el resultado deberá mostrar los últimos 12:
Código MySQL:
Ver original
  1. mysql> SET @fechaSuperior = '2013-05-16';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> SELECT * FROM tabla WHERE fecha <= @fechaSuperior
  4.     -> ORDER BY fecha DESC
  5.     -> LIMIT 12;
  6. +------+------------+
  7. | id   | fecha      |
  8. +------+------------+
  9. |   16 | 2013-05-16 |
  10. |   15 | 2013-05-15 |
  11. |   14 | 2013-05-14 |
  12. |   13 | 2013-05-13 |
  13. |   12 | 2013-05-12 |
  14. |   11 | 2013-05-11 |
  15. |   10 | 2013-05-10 |
  16. |    9 | 2013-05-09 |
  17. |    8 | 2013-05-08 |
  18. |    7 | 2013-05-07 |
  19. |    6 | 2013-05-06 |
  20. |    5 | 2013-05-05 |
  21. +------+------------+
  22. 12 rows in set (0.00 sec)

Código:
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 @fechaSuperior = '2013-05-14';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT * FROM tabla WHERE fecha <= @fechaSuperior
  5.     -> ORDER BY fecha DESC
  6.     -> LIMIT 12;
  7. +------+------------+
  8. | id   | fecha      |
  9. +------+------------+
  10. |   14 | 2013-05-14 |
  11. |   13 | 2013-05-13 |
  12. |   12 | 2013-05-12 |
  13. |   11 | 2013-05-11 |
  14. |   10 | 2013-05-10 |
  15. |    9 | 2013-05-09 |
  16. |    8 | 2013-05-08 |
  17. |    7 | 2013-05-07 |
  18. |    6 | 2013-05-06 |
  19. |    5 | 2013-05-05 |
  20. |    4 | 2013-05-04 |
  21. |    3 | 2013-05-03 |
  22. +------+------------+
  23. 12 rows in set (0.00 sec)

Código:
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 @fechaSuperior = '2013-05-16';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT * FROM tabla WHERE fecha <= @fechaSuperior
  5.     -> ORDER BY fecha DESC
  6.     -> LIMIT 12;
  7. +------+------------+
  8. | id   | fecha      |
  9. +------+------------+
  10. |   16 | 2013-05-16 |
  11. |   15 | 2013-05-15 |
  12. |   14 | 2013-05-14 |
  13. |   13 | 2013-05-13 |
  14. |   12 | 2013-05-12 |
  15. |   11 | 2013-05-11 |
  16. |   10 | 2013-05-10 |
  17. |    9 | 2013-05-09 |
  18. |    8 | 2013-05-08 |
  19. |    7 | 2013-05-07 |
  20. |    6 | 2013-05-06 |
  21. |    5 | 2013-05-05 |
  22. +------+------------+
  23. 12 rows in set (0.00 sec)

Es decir DE NADA TE SIRVE LA FECHA INFERIOR... es completamente inútil, no la necesitas. Si esto no te sirve entonces el problema está en otro lado... tal como lo comenta gnzsoloyo, a nosotros de nada nos sirve la consulta como la pones, pues no tenemos el contexto de todas las tablas, ni de los datos... trata de explicar cuál es tu situación, si es necesario, postea la estructura de todas tus tablas y pon algunos datos de ejemplo... atiende todas las observaciones que te puso gnzsoloyo y con gusto tratamos de ayudarte.

Saludos
Leo.
  #13 (permalink)  
Antiguo 03/06/2013, 09:09
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Seleccionar desde una fecha hacia abajo

Como observación final, la consulta original que planteo era esta:

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;

Para corregir el segundo punto:

Código:
2. Si entre las dos fechas existen más de 12 registros, entonces traer los más cercanos a la SEGUNDA fecha.
podrías cambiar simplemente el ORDER BY de la primer consulta del UNION...

Código:
SELECT * FROM 
(
  ( SELECT * FROM tabla 
    WHERE fecha BETWEEN @fechaInferior AND @fechaSuperior
    ORDER BY fecha DESC LIMIT 12)
    UNION 
  ( SELECT * 
    FROM tabla 
    WHERE fecha <= @fechaSuperior
    ORDER BY fecha DESC LIMIT 12)
) T 
ORDER BY fecha LIMIT 12;
Sin embargo esta consulta FUNCIONA EXACTAMENTE IGUAL QUE LA QUE PUSE EN EL POST ANTERIOR, donde sólo considero una fecha...

Saludos
Leo.
  #14 (permalink)  
Antiguo 03/06/2013, 09:16
 
Fecha de Ingreso: marzo-2013
Mensajes: 23
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Seleccionar desde una fecha hacia abajo

Ahá, es lo que me estaba temiendo después de darle mucho al coco, que solo poniendo que coja los 12 más próximos a la fecha final ya estaría. Siento haber liado esta, gracias por vuestra ayuda y comentaré con los resultados :)
  #15 (permalink)  
Antiguo 04/06/2013, 07:23
 
Fecha de Ingreso: marzo-2013
Mensajes: 23
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Seleccionar desde una fecha hacia abajo

Vale, ya está solucionado muchísimas gracias :)

Etiquetas: abajo, fecha, hacia, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:04.