基于主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
相关产品推荐
相关产品推荐

