如何用单条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
相关产品推荐
相关产品推荐

