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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:26:27