SQL Join在另一个连接表上的约束列

时间:2014-12-19 16:07:29

标签: mysql sql join

所以实际上我有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。

如何解决这个问题?谢谢你的热心帮助。我真的很感激!!

2 个答案:

答案 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