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

Duda consulta

Estas en el tema de Duda consulta en el foro de Mysql en Foros del Web. Hola, estoy perfilando una consulta y estoy viendo un par de cosas que no comprendo. Resulta que tengo 3 tablas: 1 de fotos, otra para ...
  #1 (permalink)  
Antiguo 05/03/2012, 10:12
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Duda consulta

Hola, estoy perfilando una consulta y estoy viendo un par de cosas que no comprendo.

Resulta que tengo 3 tablas: 1 de fotos, otra para catalogar esas imagenes en carpetas (listas) y otra para etiquetas en esas fotos.

Quiero sacar las imagenes que estén en una lista pero no esté yo etiquetado. Pensaba que para esto lo mejor era hacer una subconsulta en el where, y que eso devuelva cero (Ejemplo 1), tb he probado a hacer la subconsulta en la parte de seleccion de campos (ejemplo 2) para despues filtrarlo en el php, pero el mejor caso que parece funcionar es el ejemplo 3.

Código SQL:
Ver original
  1. -> 0.0024 -> Lo devuelve sin paginar en el phpmyadmin
  2.                     SELECT f.ID
  3.                     FROM listas_favoritos_elementos lfe, fotos f
  4.                     WHERE lfe.ID_USUARIO = 1 AND lfe.ID_SECCION = 8 AND lfe.ID_ELEMENTO = f.ID
  5.                     AND (SELECT COUNT(ID_FOTO) FROM fotos_etiquetas WHERE ID_FOTO = f.ID AND ID_A_QUIEN_ETIQUETA = f.ID_USUARIO LIMIT 1) = 0
  6.                     LIMIT 300
  7.  
  8.  
  9.                     -> 0.0150
  10.                     SELECT f.ID,
  11.                     (SELECT COUNT(ID_FOTO) FROM fotos_etiquetas WHERE ID_FOTO = f.ID AND ID_A_QUIEN_ETIQUETA = f.ID_USUARIO LIMIT 1) AS ETIQUETADO
  12.                     FROM listas_favoritos_elementos lfe, fotos f
  13.                     WHERE lfe.ID_USUARIO = 1 AND lfe.ID_SECCION = 8 AND lfe.ID_ELEMENTO = f.ID LIMIT 300
  14.  
  15.  
  16.                     -> 0.0018 (En teoria el LEFT JOIN no es bueno, pero resulta ser la mejor forma de devolverlo)
  17.                     SELECT f.ID
  18.                     FROM listas_favoritos_elementos lfe LEFT JOIN fotos_etiquetas fe ON lfe.ID_ELEMENTO = fe.ID_FOTO, fotos f
  19.                     WHERE lfe.ID_USUARIO = 1 AND lfe.ID_SECCION = 8 AND fe.ID_FOTO IS NULL AND lfe.ID_ELEMENTO = f.ID LIMIT 300

Utilizo un left join, pero ademas de que es mas rapido en milisegundos al perfilar no hace como en los otros dos casos que claramente son subconsultas por cada uno de los resultados.

Lo estoy haciendo bien? Pensaba que los left joins producian productos cartesianos que habian que evitar
  #2 (permalink)  
Antiguo 06/03/2012, 01:08
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Duda consulta

Si necesitas optimización de las consultas a nivel de milisegundos te recomiendo otras bases de datos como Oracle, además de sus correspondientes herramientas de monitoreo y optimización y siempre con soporte técnico contratado. Este tema es muy extenso y complejo. No hay ningún problema con hacer JOIN, además no tienes altenativa. Una subconsulta no es una sintaxis alternativa a un JOIN, consulta el manual de MySQL.
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 06/03/2012, 06:33
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Duda consulta

Entonces, la forma correcta es la tercera siempre? Mi principal pega no es los milisegundos en si, si no que para cuando se me presentan estos casos no se realmente si hay que usar la primera/segunda forma o la tercera.
  #4 (permalink)  
Antiguo 06/03/2012, 06:37
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Duda consulta

En este caso las tres consultas devuelven lo mismo, puedes usar cualquiera, pero no siempre es así. No siempre una subconsulta devuelve lo mismo que un JOIN, se trata de usar en cada caso lo que conviene. Por norma, para consultas con varias tablas relacionadas se usan JOIN, creo que además la sintaxis WHERE x = Y and z = W , etc... es obsoleta.
Saludos,
__________________
Fere libenter homines, id quod volunt, credunt.
  #5 (permalink)  
Antiguo 07/03/2012, 07:14
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Duda consulta

Que los WHERE ya no se usan? No entiendo a que te refieres, como no van a usarse los where en una consulta?

Etiquetas: join, php, select, tabla, campos
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 14:37.