You need to enable JavaScript to run this app. 如何查询每位用户最高游戏得分及关联用户详情(排行榜去重)
优惠活动
大模型
产品
解决方案
定价
更多

如何查询每位用户最高游戏得分及关联用户详情(排行榜去重)

排行榜用户最高得分查询实现说明

需求背景

网站排行榜页面需要实现以下展示规则:

  • 所有用户按历史最高游戏得分从高到低排序
  • 每位用户仅展示1条记录,取其历史最高得分,不重复展示

当前涉及两张业务表的结构与示例数据如下:

游戏得分表(game)

game_iduser_idtotal_score
11501
11401
12551
12501

用户信息表(user)

user_iduser_firstnameuser_lastname
1JohnDoe
2JaneDoe

最终预期的页面展示效果:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 17:54:03