SQL WHERE IN实现交集查询:获取匹配所有指定userId的ID方法
解决「获取与所有指定用户ID都存在映射关系的目标ID」问题
我明白你要的是那种“必须和WHERE子句里每一个userId都有对应映射”的ID,而不是和其中任意一个匹配的——这种需求其实用分组统计+过滤就能搞定,完全不用折腾逐个处理再合并,效率还更高!
先假设我们的表结构
假设你有一张映射表(比如叫user_target_mapping),字段是:
target_id:你最终要获取的目标IDuser_id:用户ID,用来关联目标ID
核心解决方案思路
- 先筛选出所有和指定用户ID相关的映射记录
- 按
target_id分组,统计每个目标ID关联的不同用户ID数量 - 只保留那些统计数量等于「指定用户ID总数」的目标ID——这就意味着这个目标ID和所有指定用户都有映射关系
对应SQL示例
示例1:当userId IN (1,2,3)时
SELECT target_id FROM user_target_mapping WHERE user_id IN (1, 2, 3) GROUP BY target_id HAVING COUNT(DISTINCT user_id) = 3;
这里的3就是你IN子句里用户ID的总数,执行后会得到唯一符合要求的target_id=1。
示例2:当userId IN (2,3)时
SELECT target_id FROM user_target_mapping WHERE user_id IN (2, 3) GROUP BY target_id HAVING COUNT(DISTINCT user_id) = 2;
此时统计数量等于2的target_id就是1和2,完全符合你的预期结果。
额外优化点
- 如果你的映射表不会出现重复的
(user_id, target_id)组合(也就是同一个用户和同一个目标ID只会有一条记录),那可以去掉DISTINCT,直接用COUNT(user_id),这样查询效率会更高。 - 如果是在应用程序里动态传入用户ID列表,你可以先计算列表的长度,再把这个数值代入HAVING子句,不用手动修改数字,非常灵活。
内容的提问来源于stack exchange,提问作者Arman
相关产品推荐
相关产品推荐

