SQL查询技巧:如何筛选同时拥有多个指定属性的userId?
筛选同时拥有指定多个属性的userId
针对你需要从props表中筛选同时拥有属性"A"和"B"的userId需求,这里提供几种实用的SQL实现方法:
方法1:GROUP BY + HAVING 统计法
这是最常用的实现方式,通过分组统计符合条件的属性数量完成筛选:
SELECT userId FROM props WHERE name IN ('A', 'B') -- 先过滤出仅包含目标属性的记录 GROUP BY userId HAVING COUNT(DISTINCT name) = 2; -- 确保该用户拥有全部2个目标属性
说明:
WHERE子句缩小数据范围,只保留和目标属性相关的记录,提升查询效率GROUP BY userId将同一用户的所有记录归为一组COUNT(DISTINCT name) = 2保证分组后的用户同时拥有2个不同的目标属性,用DISTINCT避免同一属性重复存储导致的统计误差
方法2:自连接法
通过将表与自身关联,匹配同一用户下的不同属性记录:
SELECT DISTINCT p1.userId FROM props p1 JOIN props p2 ON p1.userId = p2.userId WHERE p1.name = 'A' AND p2.name = 'B';
说明:
- 给
props表设置两个别名p1和p2,通过userId字段关联 - 分别指定
p1对应属性"A"、p2对应属性"B",只有同时满足两个条件的userId会被筛选出来 - 用
DISTINCT避免同一userId因关联逻辑被重复返回
方法3:EXISTS子查询法
通过子查询验证用户是否同时存在两个属性的记录:
SELECT DISTINCT userId FROM props p WHERE name = 'A' AND EXISTS ( SELECT 1 FROM props WHERE userId = p.userId AND name = 'B' );
说明:
- 先筛选出拥有属性"A"的所有
userId - 再通过
EXISTS子查询检查这些userId是否同时存在属性"B"的记录,EXISTS会在找到匹配记录后立即停止检索,性能更优
以上三种方法均能得到你期望的结果:userId 1和3。
内容的提问来源于stack exchange,提问作者Mamochi
相关产品推荐
相关产品推荐

