You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条MySQL查询获取未发货未取消订单的最新状态?

合并订单查询与最新状态获取的SQL语句

可以通过**窗口函数ROW_NUMBER()**来获取每个订单的最新状态记录,再和order_item表关联筛选出符合条件的订单,完整SQL如下:

SELECT
    oi.order_id,
    oi.date_in,
    oi.ship_date,
    os.status_code,
    os.status_date
FROM
    order_item oi
JOIN (
    SELECT
        order_id,
        status_code,
        status_date,
        ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY status_date DESC) AS rn
    FROM
        order_item_status
) os ON oi.order_id = os.order_id
WHERE
    oi.ship_date = 0
    AND os.rn = 1
    AND os.status_code NOT IN (140, 141)
ORDER BY
    oi.date_in ASC;

语句说明:

  • 子查询中用ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY status_date DESC)对每个order_id的状态记录按status_date倒序排序,标记每条记录的序号rn,序号为1的就是该订单的最新状态。
  • 将子查询结果与order_item表通过order_id关联,筛选出ship_date=0、最新状态(rn=1)且状态码不在(140,141)的订单,同时返回所需字段。

如果你的数据库不支持窗口函数,也可以用关联子查询的方式实现:

SELECT
    oi.order_id,
    oi.date_in,
    oi.ship_date,
    os.status_code,
    os.status_date
FROM
    order_item oi
JOIN order_item_status os ON oi.order_id = os.order_id
WHERE
    oi.ship_date = 0
    AND os.status_date = (
        SELECT MAX(status_date)
        FROM order_item_status
        WHERE order_id = oi.order_id
    )
    AND os.status_code NOT IN (140, 141)
ORDER BY
    oi.date_in ASC;

语句说明:

  • 通过关联子查询SELECT MAX(status_date) FROM order_item_status WHERE order_id = oi.order_id获取每个订单的最新状态日期,从而匹配到对应的最新状态记录。
  • 同样筛选出符合ship_date=0和状态码要求的订单。

内容的提问来源于stack exchange,提问作者Scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:59:58