我有两个带有以下字段的表:
orders.orderID
orders.orderValue
和:
payments.orderID
payments.payVal
在
payments.payVal
中,每个订单都会增量付款(多对一)。我需要选择 orders
中还有剩余付款的所有订单 (orders.orderValue - ((sum)payments.payVal) > 0 )
。
由于特殊原因,我无法使用
orderID
进行 foreach。由于某些原因,我也无法在 orders
表中添加列。我需要在一个查询中执行整个选择,例如:SELECT * FROM orders WHERE <... each(orderValue - (sum(payVal))) > 0 ...>
。
SELECT *, SUM(p.payVal) AS TotalPayed
FROM orders o
LEFT JOIN payments p ON o.orderID = p.orderID
GROUP BY o.orderID
HAVING SUM(p.payVal) < o.orderValue
这应该为您提供必要的字段,尽管我建议您通过此查询选择特定字段。
LEFT JOIN
确保您收到每笔订单,即使尚未付款。
看起来我们得出了相同的解决方案,
http://sqlfiddle.com/#!2/9a657/18
SELECT * FROM `orders`
LEFT JOIN `payments` AS p ON `orders`.`orderID` = p.`orderID`
GROUP BY `orders`.`orderID`
HAVING SUM(p.`payVal`) <= 0