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
相关产品推荐
相关产品推荐

