【问题标题】:Making SUM in RIGHT JOIN query show both records that have result or not在 RIGHT JOIN 查询中进行 SUM 显示有结果或没有结果的记录
【发布时间】:2017-04-04 03:51:41
【问题描述】:

我有 3 张桌子:

  • 产品:存储产品的总数量

  • 订单:存储订单及其状态

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

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

SELECT 
    products.sku, 
    SUM(order_items.quantity) AS quantity_pending, 
    quantity_total
FROM 
    order_items 
RIGHT JOIN 
    products ON products.sku = order_items.sku 
RIGHT JOIN 
    orders ON orders.id = order_items.order_id 
           AND paid = 1 AND shipped = 0 AND cancelled = 0
WHERE  
    products.sku = 'test' 
    OR products.sku = 'test-a' 
    OR products.sku = 'test-b' 
GROUP BY 
    products.sku

期待结果是这样的:

但实际上我得到了这个:

这意味着mysql仅在pending_quantity > 0时才显示结果。有没有办法达到我的预期?我不介意多次查询。

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

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

    输出:

    演示在这里:

    Rextester

    【讨论】:

    • 感谢您优化我的查询,但它将汇总所有内容,包括已完成的订单(已付款,已发货),而不仅仅是待处理订单(已付款,未发货)。我期望的是 test = 2, test-a = 0, test-b = 0
    • @mee 结果集不会改变,即使添加了你想要的逻辑,因为只有订单#1有产品sku,sku是test
    • 我期望的是test = 2, test-a = 0, test-b = 0。我对原始查询的问题是,虽然它显示正确的pending_qty,但它没有显示pending_qty 为零的产品。
    • 在尝试了一些事情之后,我想我有一个适合你的查询。我将订单状态检查移至子查询的WHERE 子句。这将消除计数为零的 skus,但我们仍然可以使用 COALESCE() 为外部查询中的那些 skus 报告 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2017-11-21
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多