如何排除关联表order_status中含指定status_id的orders订单?
解决方法
你的问题出在原SQL会返回订单中所有status_id !=1的记录,哪怕该订单同时存在status_id=1的记录。要实现完全排除所有包含status_id=1的订单,可以用以下几种方案:
方案一:使用NOT EXISTS(推荐,逻辑清晰)
直接筛选不存在status_id=1关联记录的订单:
SELECT o.id AS order_id FROM orders o WHERE NOT EXISTS ( SELECT 1 FROM order_status os WHERE os.order_id = o.id AND os.status_id = 1 )
方案二:使用LEFT JOIN + 空值筛选
通过左关联status_id=1的记录,筛选未匹配到的订单(即无status_id=1的订单):
SELECT o.id AS order_id FROM orders o LEFT JOIN order_status os ON o.id = os.order_id AND os.status_id = 1 WHERE os.id IS NULL
方案三:使用GROUP BY + HAVING
对订单分组后,检查是否存在status_id=1的记录,仅保留无该状态的订单:
SELECT os.order_id FROM order_status os GROUP BY os.order_id HAVING MAX(CASE WHEN os.status_id = 1 THEN 1 ELSE 0 END) = 0
注意:此方案仅会返回在order_status表中有记录的订单,如果需要包含从未有过任何状态的订单,优先选择前两种方案。
内容的提问来源于stack exchange,提问作者João
相关产品推荐
相关产品推荐

