MySQL如何查询同时匹配catid1、2、6的用户,不排除其他关联类别
正确SQL实现方案
核心思路
要筛选同时持有多个指定类别的用户,不能直接对单条记录加多个AND条件,而是通过分组聚合实现筛选:
- 先过滤出所有属于目标catid(1、2、6)的分类记录
- 按用户ID分组,统计每个用户对应的去重catid数量
- 保留数量刚好等于目标catid总数(3)的用户,即为同时持有三个类别的用户
仅查询符合要求的用户ID
SELECT USERID FROM category WHERE CATID IN (1, 2, 6) GROUP BY USERID HAVING COUNT(DISTINCT CATID) = 3;
如果你的业务中同一个USERID和CATID不会产生重复记录,可以去掉DISTINCT提升查询效率。
关联查询获取用户完整信息
如果需要同时返回用户的姓名等字段,可以关联user表查询:
SELECT u.* FROM user u JOIN category c ON u.ID = c.USERID WHERE c.CATID IN (1, 2, 6) GROUP BY u.ID, u.FIRSTNAME HAVING COUNT(DISTINCT c.CATID) = 3;
基于你提供的测试数据,上述查询只会返回ID为1的JOHN用户,符合需求。
内容的提问来源于stack exchange,提问作者ArtFranco
相关产品推荐
相关产品推荐

