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
");
Su problema es que cuando se han efectuado ningún pago, SUM(p.payment_amount)
es NULL
, y comparando NULL
a cualquier cosa siempre resulta en FALSE
(por lo tanto HAVING SUM(p.payment_amount) < o.total
no devuelve las filas). Así que hay que utilizar COALESCE
para convertir ese valor en 0
, que puede ser comparada con éxito. Tenga en cuenta que MySQL permite el uso de alias en la HAVING
cláusula, por lo que sólo puede utilizar paid
allí:
$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
");