如何在PostgreSQL中筛选完成指定全部项目的用户
筛选完成全部指定项目的PostgreSQL查询方案
方法一:分组统计符合条件的项目数
这是最直观的方案,通过分组统计每个用户完成的目标项目数量来筛选:
SELECT user_id FROM your_table_name WHERE status = 'finished' AND project IN ('p1', 'p2', 'p3') GROUP BY user_id HAVING COUNT(DISTINCT project) = 3;
说明
- 先通过
WHERE过滤出已完成且属于目标项目的有效记录,排除无关数据 - 按
user_id分组后,COUNT(DISTINCT project)统计用户完成的不同目标项目数(如果表中不会出现同一用户同一项目的重复完成记录,可去掉DISTINCT) HAVING子句筛选出完成全部3个目标项目的用户
方法二:多重EXISTS关联验证
通过多次关联表,确保用户同时存在三个项目的完成记录:
SELECT DISTINCT t1.user_id FROM your_table_name t1 WHERE t1.status = 'finished' AND t1.project = 'p1' AND EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.user_id = t1.user_id AND t2.status = 'finished' AND t2.project = 'p2' ) AND EXISTS ( SELECT 1 FROM your_table_name t3 WHERE t3.user_id = t1.user_id AND t3.status = 'finished' AND t3.project = 'p3' );
说明
- 主查询先定位完成
p1的用户,再通过两个EXISTS子查询分别验证该用户是否完成了p2和p3 DISTINCT用于避免同一用户因存在多条p1记录而被重复返回- 若给表建立
(user_id, project, status)联合索引,该方案的查询性能会更优
注意事项
- 请将代码中的
your_table_name替换为你实际使用的表名 - 两种方案各有适用场景:分组统计适合目标项目数量较多的情况;多重EXISTS在项目数量少的时候性能表现更好
内容的提问来源于stack exchange,提问作者Daniel G
相关产品推荐
相关产品推荐

