多条件SQL查询需求:筛选同时关联int2=4与int2=5的int1值
解决SQL多条件关联筛选问题:找出同时关联int2=4和5的int1
没问题,这是个很常见的多值匹配筛选场景,我给你几种靠谱的解法,都能得到你想要的int1=1、2的结果,排除只关联了其中一个值的int1=3。
先确认下你的数据表(假设表名叫your_table):
| int1 | int2 |
|---|---|
| 1 | 4 |
| 1 | 5 |
| 1 | 6 |
| 2 | 4 |
| 2 | 5 |
| 3 | 4 |
| 3 | 6 |
解法1:GROUP BY + HAVING(最直观通用)
这是处理这类“同一主键需满足多个关联条件”问题的经典写法,通过分组后统计匹配的条件数量来筛选:
SELECT int1 FROM your_table WHERE int2 IN (4, 5) -- 先过滤出包含目标值的行,提升效率 GROUP BY int1 HAVING COUNT(DISTINCT int2) = 2; -- 确保int1同时关联了4和5两个值
解释:
WHERE int2 IN (4,5)先把无关的行(比如int2=6)过滤掉,减少分组计算的数据量;GROUP BY int1按int1分组,把同一个int1的所有行聚合在一起;HAVING COUNT(DISTINCT int2) = 2统计每个分组里不同的int2值数量,等于2就说明这个int1同时有4和5的关联记录。
解法2:自连接(适合需要返回更多字段的场景)
如果之后需要同时返回int1对应的其他关联数据,自连接也是个不错的选择:
SELECT DISTINCT t1.int1 FROM your_table t1 JOIN your_table t2 ON t1.int1 = t2.int1 WHERE t1.int2 = 4 AND t2.int2 = 5;
解释:
- 把表自身连接,让t1表匹配int2=4的行,t2表匹配int2=5的行;
- 通过
ON t1.int1 = t2.int1确保两个行属于同一个int1; DISTINCT用来去重,避免同一个int1因为有多条匹配行而重复出现。
解法3:EXISTS子查询(逻辑清晰,适合复杂条件扩展)
如果之后要加更多筛选条件,EXISTS的写法可读性会更好:
SELECT DISTINCT int1 FROM your_table t WHERE EXISTS ( SELECT 1 FROM your_table WHERE int1 = t.int1 AND int2 = 4 ) AND EXISTS ( SELECT 1 FROM your_table WHERE int1 = t.int1 AND int2 = 5 );
解释:
- 外层查询遍历每个int1,通过两个EXISTS子查询分别检查:这个int1是否存在int2=4的记录,同时是否存在int2=5的记录;
- 只有两个条件都满足的int1才会被选中,逻辑非常直白。
这三种方法都能得到你想要的结果:int1=1和2,排除int1=3。如果你的数据量很大,GROUP BY的写法通常效率会更高一些,因为它的过滤和聚合步骤更紧凑。
内容的提问来源于stack exchange,提问作者jazz
相关产品推荐
相关产品推荐

