mysql - 返回状态为已交付的订单的产品总数量的 SQL(不同的两个表)

标签 mysql sql opencart product-quantity

我想获取状态为已交付的订单的产品总数量。如何将其编写为单个 sql 查询?

表_1:

<表类=“s-表”> <标题> id order_id 产品ID 数量 <正文> 1 100001 123456780 3 2 100002 123456781 1 3 100002 123456782 5 4 100003 123456783 2

表_2:

<表类=“s-表”> <标题> id order_id 订单状态 订单日期 <正文> 1 100001 准备中 2023-01-26 2 100001 准备好了 2023-01-26 3 100001 已交付 2023-01-26 4 100002 准备中 2023-01-26 5 100002 准备好了 2023-01-26 6 100002 已交付 2023-01-26 7 100003 准备中 2023-01-26 8 100004 准备中 2023-01-26 9 100001 已返回 2023-01-27

下面的 SQL 查询未按预期工作。因为它不查看订单的最新状态:

SELECT SUM(t1.quantity) AS total
  FROM table_1 t1
  LEFT JOIN table_2 t2
    ON t1.order_id = t2.order_id
 WHERE t2.order_status = 'delivered'

结果:9 (3+1+5) 此结果不正确。由于订单号 100001 的最后状态为“已返回”,因此不应将数字 3 添加到总数中。 正确的结果应该是 6 (1+5)。

最佳答案

您的查询中有两个问题:

  • 您没有获取每个 order_id 的最新记录。您可以使用 ROW_NUMBER 执行此类操作窗口函数,为按 order_date 降序排序的 order_id 的每条记录分配排名(每个 order_id 的最后一个 order_date 的 rownum = 1)。然后您可以根据 rownum = 1 进行过滤。
  • 您正在使用LEFT JOIN ,但您只需要可以在“table_2”中找到并且严格满足条件的行。您应该使用 INNER JOIN .
WITH cte AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY order_id 
                                ORDER     BY order_date DESC, id DESC) AS rn
    FROM table_2
)
SELECT SUM(quantity)
FROM      table_1 t1
INNER JOIN cte     t2
        ON t1.order_id = t2.order_id
       AND t2.order_status = 'delivered'
       AND t2.rn = 1

如果由于某种原因无法使用公用表表达式,处理它的等效方法是将 cte 转换为子查询:

SELECT SUM(quantity) 
FROM       table_1 t1 
INNER JOIN (SELECT *, ROW_NUMBER() OVER(PARTITION BY order_id 
                                        ORDER BY date DESC, id DESC) AS rn 
            FROM table_2) t2 
        ON t1.order_id = t2.order_id 
       AND t2.order_status = 'delivered' 
       AND t2.rn = 1

输出:

<表类=“s-表”> <标题> SUM(数量) <正文> 6

查看演示 here .

关于mysql - 返回状态为已交付的订单的产品总数量的 SQL(不同的两个表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75258533/

相关文章:

mysql - 从mysql备份文件导入数据时出错

mysql - 当查询超过 3 个表时,Left Join 性能太慢

sql - 为什么 IF(查询)需要一个多小时,而查询只需要不到一秒?

php - 如何通过代码刷新opencart修改

mysql - 在现有 OpenCart 数据库上使用 Doctrine 和 Symfony2

html - 我想向移动设备Opencart显示不同的背景

mysql - 仅返回检查多个连接行的行

php - 如何使用 Mysql If 函数来评估日期时间列?

mysql - 三个不同表中的最大值

java - ORDER BY 在 JPQL 查询中不起作用