El uso de GROUP BY y HAVING en un LEFT JOIN mesa donde se almacena ningún registro

KDJ:

Hay una mesa en la que se registran los datos de pago respecto de las facturas. Estoy usando SUM para contar la cantidad total del pago a la factura. Yo sólo quiero mostrar las facturas que no han sido pagados. Así que creé una cláusula WHERE utilizando GROUP BY y HAVING para mostrar sólo los registros que tienen registros sum'ing a menos que la cantidad total de la factura.

Pero ... Si no hay registros para encontrar en la tabla de pagos, el sistema no puede encontrar ninguna factura a la pantalla. ¿Alguien mas ha tenido este problema? Estoy abierto a cambiar a un formato diferente pero necesito que funcione de la misma manera en la que sólo encuentra las facturas con importes de pago de menos que el importe de la factura total debida o ningún pago en absoluto.

$query = "
SELECT o.id, o.user_id,o.invoice_number,o.total,SUM(p.payment_amount) as paid 
FROM User_Order_Details as o 
LEFT JOIN User_Payments as p ON (p.user_id = o.user_id AND p.order_id = o.id) 
WHERE o.user_id = '1' AND o.invoice_number != '' 
GROUP BY p.order_id 
HAVING SUM(p.payment_amount) < o.total 
ORDER BY o.ship_date DESC
");
Nick:

Su problema es que cuando se han efectuado ningún pago, SUM(p.payment_amount)es NULL, y comparando NULLa cualquier cosa siempre resulta en FALSE(por lo tanto HAVING SUM(p.payment_amount) < o.totalno devuelve las filas). Así que hay que utilizar COALESCEpara convertir ese valor en 0, que puede ser comparada con éxito. Tenga en cuenta que MySQL permite el uso de alias en la HAVINGcláusula, por lo que sólo puede utilizar paidallí:

$query = "
SELECT o.id, o.user_id,o.invoice_number,o.total, COALESCE(SUM(p.payment_amount),0) as paid 
FROM User_Order_Details as o 
LEFT JOIN User_Payments as p ON (p.user_id = o.user_id AND p.order_id = o.id) 
WHERE o.user_id = '1' AND o.invoice_number != '' 
GROUP BY p.order_id 
HAVING paid < o.total 
ORDER BY o.ship_date DESC
");

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=388328&siteId=1
Recomendado
Clasificación