在RIGHT JOIN查询中生成SUM显示两个都有结果的记录

时间:2017-04-04 03:51:41

标签: mysql

我有3张桌子:

  • 产品:以每个
  • 的总数量存储产品

enter image description here

  • 订单:以状态存储订单

enter image description here

  • Order_items :存储每个订单中销售的产品和数量

enter image description here

我需要找到一种方法来列出这些产品的总数量和待定数量(客户支付的产品,但尚未向他们发货,换句话说,产品数量按状态排序{ {1}},paid = 1shipped = 0)。我想出了这个SQL命令:

cancelled = 0

期待结果如下:

enter image description here

但实际上我得到了这个:

enter image description here

这意味着mysql只显示pending_quantity>的结果。有没有办法达到我的预期?我不介意多个查询。

1 个答案:

答案 0 :(得分:1)

您的查询存在许多问题。最大的问题,以及结果集中缺少某些skus的原因是,您最终加入orders表是正确的。由于此表仅包含来自sku test的订单,因此在加入期间将丢弃其他skus。

另一个问题是您从quantity_total表中选择products,但即使您正在进行分组,此列也不是聚合。我在下面做的解决方法是使用子查询来计算待处理数量,然后将其加入products表。

SELECT p.sku,
       COALESCE(t.quantity_pending, 0) AS quantity_pending,
       p.quantity_total
FROM products p
LEFT JOIN
(
    SELECT oi.sku, SUM(oi.quantity) AS quantity_pending
    FROM order_items oi
    LEFT JOIN orders o
        ON oi.order_id = o.id
    WHERE o.paid = 1 AND o.shipped = 0 AND o.cancelled = 0
    GROUP BY oi.sku
) t
    ON p.sku = t.sku
WHERE p.sku IN ('test', 'test-a', 'test-b');

<强>输出:

enter image description here

在这里演示:

Rextester