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

基于主SKU筛选库存数量超20的所有SKU的MySQL查询方法

解决MySQL主/子SKU筛选问题

咱们先明确核心需求:要找出所有主SKU库存>20的SKU组,每组包含主SKU本身和它的所有子SKU。根据你的数据规则,主SKU是不带下划线的(比如ABC、DEF),子SKU是主SKU加_DExxx后缀的形式。

下面给你两种实用的SQL写法,都能实现需求:

方法1:使用IN子查询(写法简洁)

这种方式先筛选出符合库存条件的主SKU,再匹配所有归属这些主SKU的SKU:

SELECT *
FROM DATA
WHERE SUBSTRING_INDEX(sku, '_', 1) IN (
    -- 子查询:找出所有库存>20的主SKU(不带下划线的SKU)
    SELECT sku
    FROM DATA
    WHERE sku NOT LIKE '%_%' 
      AND quantity > 20
);

代码解释:

  • SUBSTRING_INDEX(sku, '_', 1):提取SKU中第一个下划线之前的部分,用来匹配对应的主SKU(子SKU会提取出主SKU前缀,主SKU提取的就是自身)。
  • 子查询里的sku NOT LIKE '%_%':精准筛选出主SKU(因为子SKU都包含下划线),再加上quantity > 20的条件,得到符合要求的主SKU列表。
  • 外层查询把所有SKU中,主前缀属于这个列表的都选出来,也就是目标主SKU和它的所有子SKU。

方法2:使用JOIN(适合大数据量场景)

如果你的DATA表数据量很大,JOIN的性能通常比IN子查询更优,写法如下:

SELECT d.*
FROM DATA d
-- 关联符合条件的主SKU列表
JOIN (
    SELECT sku AS main_sku
    FROM DATA
    WHERE sku NOT LIKE '%_%' 
      AND quantity > 20
) m ON SUBSTRING_INDEX(d.sku, '_', 1) = m.main_sku;

代码解释:

  • 子查询同样先筛选出符合条件的主SKU,给它起别名main_sku。
  • 通过ON条件把每个SKU的主前缀和符合条件的主SKU关联起来,最终得到所有目标SKU。

验证结果

用你提供的测试数据,这两种写法都会返回:ABC、ABC_DE005、ABC_DE006、ABC_DE007、ABC_DE008、DEF、DEF_DE56、DEF_DE57、DEF_DE58、DEF_DE59、DEF_DE60、DEF_DE61,完全符合需求。

内容的提问来源于stack exchange,提问作者David L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:30:12