为何查询员工最多项目的第一条SQL语句失效,第二条正常执行?
问题梳理
现有Project数据表
| Project_id | Employee_id |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
需求
编写SQL查询所有员工数量最多的项目,预期结果:
| Project_id |
|---|
| 1 |
待分析的两条SQL语句
-- 第一条SQL select temp.project_id from( select project_id, count(distinct employee_id) from Project group by project_id order by count(distinct employee_id) desc )temp limit 1 -- 第二条SQL select project_id from Project group by project_id having count(project_id)= (select count(project_id) from Project group by Project_id order by count(project_id) desc limit 1)
问题分析
第一条SQL无法得到正确结果的原因
- 核心问题:无法返回所有符合条件的项目
子查询对项目按员工数降序排序后用limit 1,只能返回排名第一的单个项目。如果存在多个项目员工数并列最大值的情况(比如有两个项目都有2个员工),这条SQL会直接漏掉其他符合条件的项目,不符合“找出所有员工数量最多的项目”的需求。 - 次要问题:统计逻辑冗余+不规范写法
当前数据表中同一个项目下没有重复的Employee_id,count(distinct employee_id)完全没必要,用count(employee_id)或者count(*)结果一样;另外子查询里的统计字段没起别名,虽然部分数据库能兼容运行,但这不是标准的SQL写法。
第二条SQL能正常执行的原因
- 逻辑匹配需求:覆盖所有最大值项目
子查询先统计每个项目的员工数,排序后取最大值,主查询通过having子句筛选出所有员工数等于这个最大值的项目。不管有多少个项目并列员工数第一,都能全部返回,完全符合需求。 - 统计逻辑正确
count(project_id)用来统计每个项目的记录数,而每条记录对应一个员工,所以这个统计结果就是项目的员工数,和需求要统计的指标完全匹配。
内容的提问来源于stack exchange,提问作者Jennie
相关产品推荐
相关产品推荐

