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

如何在MySQL中获取每个用户的最高resultPoint分值?

解决方法

因为你需要每个用户对应最高resultPoint的完整记录,DISTINCT仅能去除完全重复的整行数据,无法筛选出每组用户的最高分记录;直接用MAX(resultPoint)分组查询时,又无法直接关联resultPercentage等其他字段,以下是两种可行的解决方案:

方案一:窗口函数(MySQL 8.0及以上版本推荐)

使用ROW_NUMBER()窗口函数按用户分组,以resultPoint降序排序,取每组的第一条记录(即该用户的最高分记录):

SELECT userUsername, resultPoint, resultPercentage, optAnswer
FROM (
    SELECT 
        info_person.userUsername,
        infoExamResult.resultPoint,
        infoExamResult.resultPercentage,
        infoExamResult.optAnswer,
        -- 按用户分组,分数降序排列,每组第一条标记为1
        ROW_NUMBER() OVER (PARTITION BY info_person.userUsername ORDER BY infoExamResult.resultPoint DESC) AS rn
    FROM info_person
    INNER JOIN infoExamResult ON infoExamResult.personID = info_person.personID
    WHERE infoExamResult.datetimeStart BETWEEN "2024-03-18" AND "2024-03-26"
      AND infoExamResult.optAnswer = "COMMIT"
) AS temp
WHERE rn = 1
ORDER BY userUsername;

如果同一用户存在多条相同最高分的记录,需要保留所有这类记录的话,将ROW_NUMBER()替换为RANK()即可。

方案二:子查询关联(兼容MySQL 5.x版本)

先通过子查询获取每个用户的最高resultPoint,再关联回原表获取对应记录的完整信息:

SELECT 
    p.userUsername,
    er.resultPoint,
    er.resultPercentage,
    er.optAnswer
FROM info_person p
INNER JOIN infoExamResult er ON er.personID = p.personID
INNER JOIN (
    -- 子查询得到每个用户在指定条件下的最高分
    SELECT personID, MAX(resultPoint) AS max_point
    FROM infoExamResult
    WHERE datetimeStart BETWEEN "2024-03-18" AND "2024-03-26"
      AND optAnswer = "COMMIT"
    GROUP BY personID
) AS max_er ON er.personID = max_er.personID AND er.resultPoint = max_er.max_point
WHERE er.datetimeStart BETWEEN "2024-03-18" AND "2024-03-26"
  AND er.optAnswer = "COMMIT"
ORDER BY p.userUsername;

内容的提问来源于stack exchange,提问作者Wu C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:17:25