You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:12:42