在没有存储记录的 LEFT JOIN table 上使用 GROUP BY 和 HAVING
Using GROUP BY and HAVING on a LEFT JOIN table where there is no records stored
有一个 table 用于记录发票的付款数据。我正在使用 SUM 计算发票的总付款金额。我只想显示尚未支付的发票。因此,我使用 GROUP BY 和 HAVING 创建了一个 WHERE 子句,以仅显示记录总和小于总发票金额的记录。
但是...如果在付款 table 中找不到任何记录,系统将找不到任何要显示的发票。其他人有这个问题吗?我愿意更改为不同的格式,但我需要它以相同的方式运行,它只查找付款金额小于应收发票总金额或根本没有付款的发票。
$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
");
你的问题是,当没有付款时,SUM(p.payment_amount)
是 NULL
,将 NULL
与任何东西进行比较总是会得到 FALSE
(因此 HAVING SUM(p.payment_amount) < o.total
没有 return 那些行)。所以需要用COALESCE
把那个值转换成0
,然后才能比较成功。请注意,MySQL 允许您在 HAVING
子句中使用别名,因此您可以只在此处使用 paid
:
$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
");
有一个 table 用于记录发票的付款数据。我正在使用 SUM 计算发票的总付款金额。我只想显示尚未支付的发票。因此,我使用 GROUP BY 和 HAVING 创建了一个 WHERE 子句,以仅显示记录总和小于总发票金额的记录。
但是...如果在付款 table 中找不到任何记录,系统将找不到任何要显示的发票。其他人有这个问题吗?我愿意更改为不同的格式,但我需要它以相同的方式运行,它只查找付款金额小于应收发票总金额或根本没有付款的发票。
$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
");
你的问题是,当没有付款时,SUM(p.payment_amount)
是 NULL
,将 NULL
与任何东西进行比较总是会得到 FALSE
(因此 HAVING SUM(p.payment_amount) < o.total
没有 return 那些行)。所以需要用COALESCE
把那个值转换成0
,然后才能比较成功。请注意,MySQL 允许您在 HAVING
子句中使用别名,因此您可以只在此处使用 paid
:
$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
");