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

MySQL查询需求:筛选当前状态为23且历史状态曾包含33的订单ID

嘿,我来帮你解决这个问题!首先得提个小细节:你原查询里的LEFT JOIN关联条件可能不符合业务逻辑——订单和它的状态历史记录应该通过orders_id来关联(一个订单对应多条状态历史),而不是用当前订单状态去匹配历史状态ID。接下来基于正确的关联逻辑,给你几种靠谱的实现方案:

方案1:使用EXISTS子查询(推荐)

EXISTS专门用来判断「是否存在满足条件的记录」,执行效率很高,逻辑也特别清晰:

SELECT o.orders_id 
FROM orders o 
WHERE o.orders_status = 23
AND EXISTS (
    SELECT 1 
    FROM orders_status_history h 
    WHERE h.orders_id = o.orders_id  -- 关联订单ID,定位到该订单的所有状态历史
      AND h.orders_status_id = 33    -- 检查是否存在状态为33的历史记录
)
方案2:使用IN子查询

如果你更习惯子查询的写法,用IN也能轻松实现需求:

SELECT o.orders_id 
FROM orders o 
WHERE o.orders_status = 23
AND o.orders_id IN (
    SELECT h.orders_id 
    FROM orders_status_history h 
    WHERE h.orders_status_id = 33
)
方案3:使用JOIN + DISTINCT

通过INNER JOIN关联出有状态33历史的订单,再用DISTINCT去重(毕竟一个订单可能有多条状态33的历史记录):

SELECT DISTINCT o.orders_id 
FROM orders o 
INNER JOIN orders_status_history h 
    ON o.orders_id = h.orders_id
WHERE o.orders_status = 23
  AND h.orders_status_id = 33

小补充

这三种方法的核心逻辑都是:先锁定当前状态为23的订单,再过滤出在状态历史表中存在至少一条状态ID为33的记录的订单。其中EXISTS通常是性能最优的选择,因为它一旦找到匹配的记录就会停止查询,不需要扫描全部符合条件的历史记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:52:51