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 (SUM(PQ.new_quantity
) - SUM(PP.purchased_article_total
) ) stock_restante
, PW.nombre,
PW.detalles,
PW.price,
PW.image_full,
PW.fecha,
PW.article_hashid
wm_products_wall PW
wm_products_quantities PQ
ON PW.article_hashid
= PQ.hashid_ref
wm_purchased_products PP
ON PW.article_hashid
= PP.purchased_article_id
wm_products_wall.categoria = '$new_rquery_xp'
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.