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

MySQL 8.0.35中MaxSum查询返回错误faculty_id值的问题

问题原因与解决方法

问题根源

你编写的SQL外层仅按activity_id分组,但user_id和u.faculty_id既不在GROUP BY子句中,也未通过聚合函数处理。MySQL在这种场景下会返回分组内随机一行的非聚合列值,这就是faculty_id不正确的核心原因——它没有对应到产生最大距离总和的那行用户数据。

正确查询写法

方法一:子查询关联(兼容旧版本)

先计算每日的距离总和,再找出每个活动的最大总和,最后关联回原数据拿到正确的用户信息:

SELECT s.su AS value, s.activity_id, s.user_id, u.faculty_id
FROM (
    SELECT SUM(distance) AS su, activity_id, user_id
    FROM submission
    WHERE week = 2 AND accepted = 1 AND season_id = 859
    GROUP BY date, user_id, activity_id
) AS s
INNER JOIN user u ON s.user_id = u.id
INNER JOIN (
    SELECT MAX(su) AS max_su, activity_id
    FROM (
        SELECT SUM(distance) AS su, activity_id
        FROM submission
        WHERE week = 2 AND accepted = 1 AND season_id = 859
        GROUP BY date, user_id, activity_id
    ) AS temp
    GROUP BY activity_id
) AS max_vals ON s.su = max_vals.max_su AND s.activity_id = max_vals.activity_id;

方法二:窗口函数(MySQL 8.0+推荐)

利用MySQL 8.0支持的窗口函数直接对每个活动的距离总和排序,取排名第一的行:

WITH daily_sums AS (
    SELECT SUM(distance) AS su, activity_id, user_id
    FROM submission
    WHERE week = 2 AND accepted = 1 AND season_id = 859
    GROUP BY date, user_id, activity_id
),
ranked_sums AS (
    SELECT 
        su AS value,
        activity_id,
        user_id,
        u.faculty_id,
        RANK() OVER (PARTITION BY activity_id ORDER BY su DESC) AS rnk
    FROM daily_sums
    INNER JOIN user u ON daily_sums.user_id = u.id
)
SELECT value, activity_id, user_id, faculty_id
FROM ranked_sums
WHERE rnk = 1;

效果说明

两种写法都能确保user_id和faculty_id对应到产生该活动最大距离总和的用户数据,避免随机取值的问题,返回结果会与你的预期一致。

内容的提问来源于stack exchange,提问作者Jiří Velek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:36:14