Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/03/2012, 10:12
leif_sk8er
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 15 años, 7 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