如何在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
相关产品推荐
相关产品推荐

