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

Consulta a dos tablas en un query se queda en un loop

Estas en el tema de Consulta a dos tablas en un query se queda en un loop en el foro de Mysql en Foros del Web. Saludos, Estoy tratando de hacer en un solo query consulta a dos tablas que se correlacionan. El problema es que cuando trato en el where ...
  #1 (permalink)  
Antiguo 06/09/2013, 08:32
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Consulta a dos tablas en un query se queda en un loop

Saludos,

Estoy tratando de hacer en un solo query consulta a dos tablas que se correlacionan. El problema es que cuando trato en el where de hacer la consulta hacia las dos tablas se queda, nunca termina, porque son muchos registros. Ejemplo

Código MySQL:
Ver original
  1. SELECT * FROM foo AS f LEFT JOIN bar AS b ON b.foo_id = f.foo_id
  2.                 (b.created_datetime BETWEEN "2013-08-05" AND "2013-08-06")
  3.                 OR
  4.                 (f.created_datetime BETWEEN "2013-08-05" AND "2013-08-06")
  5.              )
  6. GROUP BY f.foo_id

Si los hago individual,

Código MySQL:
Ver original
  1. SELECT * FROM foo AS f LEFT JOIN bar AS b ON b.foo_id = f.foo_id
  2.                 (b.created_datetime BETWEEN "2013-08-05" AND "2013-08-06")
  3.              )
  4. GROUP BY f.foo_id
  5.  
  6.  
  7. ------------------------------- o -------------------------------
  8.  
  9.  
  10. SELECT * FROM foo AS f LEFT JOIN bar AS b ON b.foo_id = f.foo_id
  11.                 (f.created_datetime BETWEEN "2013-08-05" AND "2013-08-06")
  12.              )
  13. GROUP BY f.foo_id

Sale el resultado. Sé que con UNION lo puedo lograr, pero no me es posible por la forma que lo hago en la programación. Aparte de esa opción, ¿estoy haciendo algo mal en la consulta?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #2 (permalink)  
Antiguo 06/09/2013, 09:17
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Consulta a dos tablas en un query se queda en un loop

Bueno, por ahora, hice una forma para lograrlo con UNION, pero si hay que corregir algo en el código me gustaría que me lo indicaran para así aprender
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 06/09/2013, 10:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta a dos tablas en un query se queda en un loop

El LEFT JOIN sólo debe usarse cuando la primera tabla (izquierda) es la de más alta selectividad, o bien sea la tabla que en la lógica de lo que se busca, sea la tabla básica.
Esto implica que si quieres los movimientos de productos incluyendo los que no se movieron, la tabla izquierda es Productos; pero si lo que quieres es cuándo hubo movimientos de productos que se vendieron, la tabla izquierda podría ser la de movimientos.
Es decir, depende de lo que deseas obtener.
En tu caso, habría que ver cuál de las dos tablas es la que tiene menor cantidad de registros, o cuál es la que determina la lógica del reporte a obtener, y ordenarlas en consecuencia. No te olvides que tanto en el LEFT JOIN como en el RIGHT JOIN el orden de los factores si altera el producto en SQL.

Por otro lado, debes tener en cuenta que si en la primer tabla los registros devueltos son muchos, el GROUP BY se vuelve un poco problemático en la performance. Hay que verificar si realmente es eficiente para tu caso, y si es posible aumentar las condiciones para reducir los registros devueltos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 06/09/2013, 12:13
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Consulta a dos tablas en un query se queda en un loop

Si, no te preocupes que por eso coloqué el left join, porque la primera es la de los registro, la otra es un log de cambios hechos a esos registros.

Una duda ¿qué se ejecuta primero el group by o el where? Porque en el where lo limito a una cantidad de días que son menos los registros.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 06/09/2013, 12:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta a dos tablas en un query se queda en un loop

El orden de ejecución es:
1) FROM.
2) WHERE
3) GROUP BY
4) LIMIT (es lo último)

En este caso el problema es saber cuántos registros está devolviendo la consulta, y para eso es mejor hacer simplemente un EXPLAIN. Eso nos puede dar una idea de qué está pasando:
Código MySQL:
Ver original
  1.     FROM foo f LEFT JOIN bar b ON b.foo_id = f.foo_id
  2.    WHERE (   (b.created_datetime BETWEEN '2013-08-05' AND '2013-08-06')
  3.           OR (f.created_datetime BETWEEN '2013-08-05' AND '2013-08-06')
  4.          )
  5. GROUP BY f.foo_id;
Aún así, yo buscaría probar:
Código MySQL:
Ver original
  1.     (SELECT   *
  2.        FROM foo
  3.       WHERE created_datetime BETWEEN '2013-08-05' AND '2013-08-06') f
  4.      LEFT JOIN  
  5.      (SELECT   *
  6.        FROM bar
  7.       WHERE created_datetime BETWEEN '2013-08-05' AND '2013-08-06') b
  8.       ON f.foo_id = b.foo_id
  9. GROUP BY f.foo_id;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 10/09/2013, 06:51
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Consulta a dos tablas en un query se queda en un loop

Hmmmm interesante, lo pruebo y te dejo saber, gracias
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: php
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 10:48.