我写了一个愚蠢的小游戏,并希望有一些领导板网站.
通常排行榜只限于10或20名顶级球员,但我认为如果我能为每位球员记录他们的最高分,那将是很好的.然后,我总能展示他们的世界级别.
一个简单的架构,例如:
create table leaderboard ( userid varchar(128) not null, score real not null, when datetime not null ); create index on leaderboard(userid);
将存储我需要的最少量信息 - 每个用户输入1个最佳分数.
我的问题围绕如何有效地确定某人在排行榜上的位置.一般的想法是,我希望他们在列表返回的位置:
select userid from leaderboard order by score desc
但是从DB性能的角度来看,运行此查询然后线性搜索列表对我来说似乎有点荒谬.即使这样,我也很难想象一个能够快速操作的查询/模式.
有任何想法吗?
(我更希望保持数据库架构和查询通用(不依赖于供应商).但是,如果一个供应商使这很容易,我很乐意使用MS SQL或MySQL.
怎么样:
select count(*)+1 as rank from leaderboard where score > (select score from leaderboard where userid = ?)
您还需要分数列上的索引.
这样做count()+1
有score > (...)
会给你即使当多个玩家具有相同的比分准确行列; 这样做count()
有score >= (...)
不会.