MySQL查询:如何获取关联全部指定id2值的id1记录
正确查询同时关联id2=2和id2=3的id1的SQL语句
你的原查询语句Select id1 from table where id2 in (2,3) group by id1;的问题在于,它仅筛选出关联了id2=2或id2=3的记录,分组后只要id1满足其中一个条件就会被返回,所以id1=2(仅关联id2=2)也会出现在结果里。要筛选出同时关联两个id2值的id1,有几种常用的写法:
方法1:使用HAVING COUNT(DISTINCT id2)
这是最常用的聚合筛选方式,通过统计分组后不同id2的数量来确保同时包含2和3:
SELECT id1 FROM table WHERE id2 IN (2, 3) GROUP BY id1 HAVING COUNT(DISTINCT id2) = 2;
- 先通过
WHERE筛选出id2为2或3的记录 - 按id1分组后,用
HAVING检查每个分组里不同id2的数量是否等于2(即同时包含2和3)
方法2:自连接查询
通过自连接匹配同时存在id2=2和id2=3的id1:
SELECT t1.id1 FROM table t1 JOIN table t2 ON t1.id1 = t2.id1 WHERE t1.id2 = 2 AND t2.id2 = 3;
- 把表自身作为两个表t1和t2,分别筛选出id2=2和id2=3的记录
- 通过id1关联,得到同时满足两个条件的id1
方法3:使用EXISTS子查询
先筛选出关联id2=2的id1,再检查这些id1是否存在关联id2=3的记录:
SELECT DISTINCT id1 FROM table t1 WHERE id2 = 2 AND EXISTS ( SELECT 1 FROM table t2 WHERE t2.id1 = t1.id1 AND t2.id2 = 3 );
EXISTS子查询会快速判断当前id1是否有对应的id2=3记录,效率较高- 用
DISTINCT避免重复返回同一个id1
内容的提问来源于stack exchange,提问作者Shubham Singal
相关产品推荐
相关产品推荐

