MySQL如何查询仅包含指定SKU组合的对应订单
MySQL查询符合指定SKU范围的订单解决方案
核心判断条件
只要同时满足两个规则即可返回对应订单:
- 该订单下所有订单项的SKU都在指定范围[1,2,3]内,不存在超出范围的SKU
- 该订单至少包含1个属于指定范围的SKU(可按需去掉该条件,适配允许空订单的场景)
实现方案
方案1:分组聚合过滤(性能最优,推荐使用)
直接对订单项表按订单ID分组,通过聚合函数做全局判断,无需额外关联查询:
SELECT order_id FROM order_items GROUP BY order_id HAVING MAX(sku NOT IN (1,2,3)) = 0 AND MIN(sku IN (1,2,3)) = 1;
逻辑说明:
MAX(sku NOT IN (1,2,3)) = 0:只要订单存在任意一个超出范围的SKU,这个聚合值就为1,会被直接过滤MIN(sku IN (1,2,3)) = 1:保证订单至少存在一个符合范围的SKU,避免返回无有效订单项的空订单
如果需要关联订单主表取更多订单字段,可使用以下写法:
SELECT o.* FROM `order` o INNER JOIN ( SELECT order_id FROM order_items GROUP BY order_id HAVING MAX(sku NOT IN (1,2,3)) = 0 AND MIN(sku IN (1,2,3)) = 1 ) valid_orders ON o.id = valid_orders.order_id;
注意order是MySQL关键字,查询时需要用反引号包裹。
方案2:双重NOT EXISTS(逻辑最直观,易理解)
SELECT DISTINCT oi.order_id FROM order_items oi WHERE oi.sku IN (1,2,3) AND NOT EXISTS ( SELECT 1 FROM order_items oi2 WHERE oi2.order_id = oi.order_id AND oi2.sku NOT IN (1,2,3) );
测试结果
针对你提供的示例数据,两种方案返回的有效订单ID均为:
- 100
- 101
- 102
- 103
- 104
包含超出范围SKU4的订单105会被正确过滤,完全符合你要求的返回组合规则。
内容的提问来源于stack exchange,提问作者Pit Digger
相关产品推荐
相关产品推荐

