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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:39:01