MySQL筛选包含product_id=1且无Y数据的订单ID
问题分析与SQL修正
你当前的SQL存在两个问题:
- 误将
op.product_id = 1写成了op.id = 1(你的表结构里order_products没有id字段) - 缺少过滤订单内存在
product_data含"Y"的产品的逻辑
结合你的三个筛选条件,这里提供两种可行的修改方案:
方案一:使用NOT EXISTS子查询
SELECT op.order_id FROM order_products op JOIN orders o ON o.order_id = op.order_id WHERE o.count = 3 AND op.product_id = 1 AND NOT EXISTS ( SELECT 1 FROM order_products op2 WHERE op2.order_id = op.order_id AND op2.product_data LIKE '%Y%' ) GROUP BY op.order_id
方案二:使用GROUP BY + HAVING组合
SELECT op.order_id FROM order_products op JOIN orders o ON o.order_id = op.order_id WHERE o.count = 3 GROUP BY op.order_id HAVING SUM(CASE WHEN op.product_id = 1 THEN 1 ELSE 0 END) >= 1 AND SUM(CASE WHEN op.product_data LIKE '%Y%' THEN 1 ELSE 0 END) = 0
逻辑说明
- 订单产品数量为3:通过
o.count = 3关联orders表实现 - 包含product_id=1的产品:
- 方案一通过
op.product_id = 1直接筛选出包含该产品的订单记录,再通过GROUP BY去重 - 方案二通过
HAVING里的统计逻辑,确保订单内存在至少一个product_id=1的产品
- 方案一通过
- 所有产品product_data不含"Y":
- 方案一通过
NOT EXISTS子查询,排除掉订单内存在任何product_data含"Y"的记录 - 方案二通过
HAVING里的统计逻辑,确保订单内没有product_data含"Y"的产品
- 方案一通过
两种方案都能得到预期结果order_id = 2。
内容的提问来源于stack exchange,提问作者user1031743
相关产品推荐
相关产品推荐

