【发布时间】:2016-09-13 10:22:24
【问题描述】:
我正在开发一个包含多个游戏并且应该能够处理数百万玩家的服务器应用。每个游戏都需要一个排行榜,并且必须能够显示玩家的当前位置和前 10 名玩家,以及玩家朋友的位置。
目前我正在使用两个表。
user_score
- 身份证
- user_id
- game_id
- 得分
- created_at
user_max_score
- 身份证
- user_id
- game_id
- max_score
- created_at
- updated_at
每当用户第一次玩任何游戏时,都会在第一张和第二张表中插入数据。如果用户第二次玩并且得分高于他们之前的得分,我们将数据插入 user_score 表并使用新的 max_score 更新 user_max_score 表。
为了获得用户的排名,我这样触发查询。
SET @i=0;
SELECT id, user_id, max_score, @i:=@i+1 AS rank
FROM user_max_score WHERE game_id = $gameId
ORDER BY max_score DESC, updated_at ASC;
还有比这更好的方法吗?
【问题讨论】:
-
删除
user_max_score表并执行SELECT user_id, MAX(score) AS max_score FROM user_score GROUP BY user_id之类的操作(请参阅stackoverflow.com/questions/7745609/…) -
有一段时间了,你是怎么解决这个问题的@dgoku?