MySQL按columnA分组,精确匹配columnB指定值集查询columnA
解决MySQL分组匹配完全指定值的问题
需求说明
现有MySQL表结构及数据如下:
| columnA | columnB |
|---|---|
| 1 | v1 |
| 1 | v2 |
| 2 | v1 |
| 2 | v2 |
| 2 | v3 |
需要查询满足columnB完全匹配传入的指定值集合的columnA值。例如传入v1和v2时,仅返回columnA=1(因为columnA=2的columnB包含额外的v3)。
现有SQL的问题
你当前写的SQL无法实现完全匹配的需求,它只会筛选出包含指定值的columnA,但无法排除那些包含额外值的情况。
正确的SQL实现
方法一:分组统计+条件过滤
SELECT columnA FROM your_table_name GROUP BY columnA HAVING -- 确保分组内包含所有指定的columnB值 SUM(CASE WHEN columnB IN ('v1', 'v2') THEN 1 ELSE 0 END) = 2 -- 确保分组内没有其他额外的columnB值 AND COUNT(DISTINCT columnB) = 2;
说明:
SUM(...) = 2中的2是传入值的数量,若传入3个值则改为3,以此类推。COUNT(DISTINCT columnB) = 2确保该分组的columnB数量和传入值数量一致,避免存在额外值。
方法二:排除法+分组
SELECT columnA FROM your_table_name WHERE columnA NOT IN ( SELECT columnA FROM your_table_name WHERE columnB NOT IN ('v1', 'v2') ) GROUP BY columnA HAVING COUNT(DISTINCT columnB) = 2;
说明:
- 子查询先排除所有包含非指定值的columnA。
- 外层分组后验证columnB的数量是否和传入值数量一致,确保没有遗漏指定值。
动态参数适配(可选)
如果需要动态传入参数,可以使用MySQL的FIND_IN_SET配合变量实现,例如:
-- 假设传入值用逗号分隔的字符串,如'v1,v2',值数量为2 SET @values = 'v1,v2'; SET @count = 2; SELECT columnA FROM your_table_name GROUP BY columnA HAVING SUM(CASE WHEN FIND_IN_SET(columnB, @values) THEN 1 ELSE 0 END) = @count AND COUNT(DISTINCT columnB) = @count;
内容的提问来源于stack exchange,提问作者ProgZi
相关产品推荐
相关产品推荐

