如何查询每位用户最高游戏得分及关联用户详情(排行榜去重)
排行榜用户最高得分查询实现说明
需求背景
网站排行榜页面需要实现以下展示规则:
- 所有用户按历史最高游戏得分从高到低排序
- 每位用户仅展示1条记录,取其历史最高得分,不重复展示
当前涉及两张业务表的结构与示例数据如下:
游戏得分表(game)
game_id user_id total_score 1 1 501 1 1 401 1 2 551 1 2 501
用户信息表(user)
user_id user_firstname user_lastname 1 John Doe 2 Jane Doe
最终预期的页面展示效果:
Jane Doe - 551 John Doe - 501
现有查询的问题
当前编写的SQL语句直接关联两张表后,会返回每个用户的全部历史得分记录,未做聚合去重处理,无法满足“每用户仅取最高分、不重复展示”的要求,现有语句:
SELECT USERS.user_firstname, USERS.user_lastname, GAMES.total_score FROM [GAMES] INNER JOIN [USERS] ON GAMES.user_id = USERS.user_id ORDER BY [total_score] DESC
实现方案
核心逻辑是先对游戏得分表按用户ID分组,聚合取出每个用户的最高得分,再将聚合结果与用户信息表关联获取用户姓名,最后按得分降序排序即可,推荐的可运行SQL如下:
SELECT USERS.user_firstname, USERS.user_lastname, user_max_score.max_score FROM [USERS] INNER JOIN ( -- 子查询:按用户分组,取出每个用户的历史最高得分 SELECT user_id, MAX(total_score) AS max_score FROM [GAMES] GROUP BY user_id ) AS user_max_score ON USERS.user_id = user_max_score.user_id ORDER BY user_max_score.max_score DESC
如果需要直接拼接成页面展示的“姓名 - 得分”格式,可以调整SELECT逻辑为字符串拼接:
SELECT CONCAT(USERS.user_firstname, ' ', USERS.user_lastname, ' - ', user_max_score.max_score) AS rank_display FROM [USERS] INNER JOIN ( SELECT user_id, MAX(total_score) AS max_score FROM [GAMES] GROUP BY user_id ) AS user_max_score ON USERS.user_id = user_max_score.user_id ORDER BY user_max_score.max_score DESC
这种写法不需要做复杂的去重判断,分组聚合后每个用户仅对应1条最高得分记录,关联用户表时不会出现重复的用户条目,查询性能也更优。
内容的提问来源于stack exchange,提问作者Mooney_S
相关产品推荐
相关产品推荐

