如何在MySQL中使用MAX筛选总工时最高的项目行?
解决MySQL查询总工时最多项目的问题
问题原因
你之前的语句报错是因为:
WHERE子句在分组和聚合计算之前执行,这时候total_hours这个别名还没生成,MySQL自然找不到这个列。- 聚合函数(比如
MAX())不能直接用在WHERE里,WHERE只能过滤原始行,要过滤聚合后的结果得用HAVING,或者通过子查询实现。
可行解决方案
方法1:子查询+HAVING(兼容所有MySQL版本)
先通过子查询算出所有项目的总工时,找到最大值后,再关联筛选出对应项目:
SELECT p.pname, SUM(w.hours) AS total_hours FROM project p JOIN works_on w ON p.pnumber = w.pno GROUP BY p.pname, p.pnumber -- 加上pnumber避免同名项目分组错误 HAVING SUM(w.hours) = ( SELECT MAX(sub_total) FROM ( SELECT SUM(hours) AS sub_total FROM works_on GROUP BY pno ) AS project_totals );
方法2:窗口函数(MySQL 8.0+)
如果你的MySQL版本是8.0及以上,用窗口函数RANK()更简洁,还能处理多个项目总工时并列第一的情况:
WITH project_total_hours AS ( SELECT p.pname, SUM(w.hours) AS total_hours FROM project p JOIN works_on w ON p.pnumber = w.pno GROUP BY p.pname, p.pnumber ) SELECT pname, total_hours FROM ( SELECT *, RANK() OVER(ORDER BY total_hours DESC) AS rank_num FROM project_total_hours ) AS ranked_projects WHERE rank_num = 1;
简化版(仅适用于单一最大值场景)
如果你确定只有一个项目总工时最高,可以用LIMIT直接取排序后的第一条,写法更简单:
SELECT p.pname, SUM(w.hours) AS total_hours FROM project p JOIN works_on w ON p.pnumber = w.pno GROUP BY p.pname, p.pnumber ORDER BY total_hours DESC LIMIT 1;
补充提示
分组时尽量带上项目的唯一标识(比如pnumber),避免不同项目同名导致的分组错误。
内容的提问来源于stack exchange,提问作者Jeffery
相关产品推荐
相关产品推荐

