MySQL如何编写SELECT查询语句筛选同时属于group_id 2和3的user_id
假设你的数据表名为user_group,可使用以下两种常用的SQL写法实现需求:
写法1:分组统计子查询
SELECT user_id, group_id FROM user_group WHERE user_id IN ( SELECT user_id FROM user_group WHERE group_id IN (2, 3) GROUP BY user_id HAVING COUNT(DISTINCT group_id) = 2 );
逻辑说明:内层子查询先筛选group_id为2或3的记录,按user_id分组后统计去重后的group_id数量,数量等于2的就是同时拥有两个group的用户;外层查询直接取出这些用户的所有关联记录。
如果你的表中同一个user_id和group_id不会存在重复记录,可以去掉DISTINCT关键字,直接写COUNT(group_id) = 2,查询性能更好。
如果你只需要返回这些用户的group_id为2和3的记录(和你给出的预期结果完全一致),可以在外层WHERE条件中额外加AND group_id IN (2, 3)即可。
写法2:EXISTS双重校验
SELECT ug1.user_id, ug1.group_id FROM user_group ug1 WHERE EXISTS (SELECT 1 FROM user_group ug2 WHERE ug2.user_id = ug1.user_id AND ug2.group_id = 2) AND EXISTS (SELECT 1 FROM user_group ug3 WHERE ug3.user_id = ug1.user_id AND ug3.group_id = 3);
逻辑说明:直接校验当前用户是否同时存在group_id=2和group_id=3的记录,符合条件的用户的所有关联记录都会被返回。如果你的表中user_id和group_id建有联合索引,该写法的查询效率会更高。
内容的提问来源于stack exchange,提问作者Kiều Toàn
相关产品推荐
相关产品推荐

