我正在开发一个类似游戏的应用程序,带有排行榜,并希望排行榜具有以下功能:
目前我有两张桌子:
用户:
除了所有用户特定数据之外,该表还有一个积分列
查询获取历史 TOP 100:
SELECT uuid, points FROM user ORDER BY points DESC LIMIT 100
用户分数:
列:id、uuid、user_uuid、game_uuid、score_change、时间戳
这里有一些伪示例行:
|id| uuid | user_uuid | game_uuid | score_change|ts|
|--|-----------|----------------|----------------|-------------|--|
|1 | some_uuid | uuid_of_user_a | uuid_of_game_a | 2 |22|
|2 | some_uuid | uuid_of_user_a | uuid_of_game_b | 1 |24|
|3 | some_uuid | uuid_of_user_a | uuid_of_game_c | 3 |28|
每场比赛结束后,用户的分数变化都会写入此处。
查询以获取例如每周排行榜:
SELECT SUM(score_change) AS total, user_uuid
FROM user_scores WHERE timestamp > week_begin & timestamp < week_end
GROUP BY user_uuid ORDER BY total DESC LIMIT 100
当然,我也可以从 user_scores 表中查询历史前 100 名,但我认为这可能更有效,因为我不必获取整个 user_scores 表。
到目前为止一切顺利。但如何落实队伍的趋势呢?
您应该为每个分数变化添加时间戳列。 即时计算分数。