所以实际上我有3张桌子:
产品
ID
订单
ID
状态
ORDER_ITEMS
ID
ORDER_ID
PRODUCT_ID
量
所以我想按产品表查询主要表。我想知道每个订购了多少,因此
SELECT products.*, SUM(order_items.quantity) AS sale_count
FROM products
LEFT JOIN order_items ON products.id = order_items.product_id
GROUP BY products.id
一切正常,没问题。但是此查询会计算每行的order_items
,现在我只想在订单状态为done
时计算。但问题是要获得order_items
您需要引用orders
的状态吗?
SELECT products.*, SUM(order_items.quantity) AS sale_count
FROM products
LEFT JOIN order_items ON products.id = order_items.product_id
LEFT JOIN orders ON order_items.order_id = orders.id AND orders.status = 'done'
GROUP BY products.id
但是这不会对order_items进行约束,而只会将状态为done
的订单显示在表中,否则为NULL。
如何解决这个问题?谢谢你的热心帮助。我真的很感激!!
答案 0 :(得分:1)
我认为你只想要条件聚合:
SELECT p.*,
SUM(CASE WHEN o.status = 'done' THEN order_items.quantity END) AS sale_count
FROM products p LEFT JOIN
order_items oi
ON p.id = oi.product_id LEFT JOIN
orders o
ON oi.order_id = o.id
GROUP BY p.id;
我将'done'
条件移至case
语句。如果您愿意,也可以将其保留在on
子句中。我只是觉得这个逻辑更清楚你的意图。
答案 1 :(得分:1)
我并不是100%清楚你要问的是什么,但我认为你问的是如何计算订单状态的订单,而不会丢弃订单状态未完成的结果。如果是这样,那么以下内容应该有效:
SELECT products.*,
SUM(CASE WHEN orders.status = 'done'
THEN order_items.quantity
ELSE 0 END) AS sale_count
FROM products
LEFT JOIN order_items
ON products.id = order_items.product_id
LEFT JOIN orders
ON order_items.order_id = orders.id
GROUP BY products.id