Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/05/2011, 10:08
Avatar de gnzsoloyo
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: Que falla en esta consulta ??!!

El problema tiene varios puntos:
- Si vas a usar un JOIN donde una de las tablas puede no tener registros relacionados con la otra, debes usar LEFT JOIN, no JOIN ni coma como sustituto.
- Si tienes que usar LEFT JOIN debes asegurarte de que la tabla de la izquierda sea la que siempre tiene al menos un registro que pueda ser contenido en la respuesta. En tu caso, es la lista de productos, no la de existencias o ventas.
- Si la respuesta final puede ser NULL, debes usar IFNULL para resolver el dato.
- Nunca indiques la relación entre las tablas en el WHERE. El parser no lo puede optimizar y obligas a MySQL a leer registros inútiles, ya que el WHERE se aplica luego de leer las tablas y por cada registro devuelto. Es muy ineficiente.
Código MySQL:
Ver original
  1.     (SUM(PQ.new_quantity) -  SUM(PP.purchased_article_total) ) stock_restante,
  2.     PW.nombre,
  3.     PW.detalles,
  4.     PW.price,
  5.     PW.image_full,
  6.     PW.fecha,
  7.     PW.article_hashid
  8.     wm_products_wall PW
  9.     LEFT JOIN
  10.     wm_products_quantities PQ ON PW.article_hashid = PQ.hashid_ref
  11.     LEFT JOIN
  12.     wm_purchased_products PP ON PW.article_hashid = PP.purchased_article_id
  13.     wm_products_wall.categoria = '$new_rquery_xp'
  14. GROUP BY PW.article_hashid
  15. ORDER BY stock_restante ASC

Tips finales:
- Trata de usar alias en las tablas, de modo de poder simplificar la lectura.
- Escribe las sentencias de forma estructurada (con indentación) para poder leer de arriba abajo toda la consulta de una forma simple, y no tener que seguir linealmente el contenido. Cuano lo haces lineal resulta confuso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)