领导板的高效SQL查询/架构

Fra*_*ger 8 sql

我写了一个愚蠢的小游戏,并希望有一些领导板网站.

通常排行榜只限于10或20名顶级球员,但我认为如果我能为每位球员记录他们的最高分,那将是很好的.然后,我总能展示他们的世界级别.

一个简单的架构,例如:

create table leaderboard (
    userid varchar(128) not null,
    score real not null,
    when datetime not null
);
create index on leaderboard(userid);
Run Code Online (Sandbox Code Playgroud)

将存储我需要的最少量信息 - 每个用户输入1个最佳分数.

我的问题围绕如何有效地确定某人在排行榜上的位置.一般的想法是,我希望他们在列表返回的位置:

select userid from leaderboard order by score desc
Run Code Online (Sandbox Code Playgroud)

但是从DB性能的角度来看,运行此查询然后线性搜索列表对我来说似乎有点荒谬.即使这样,我也很难想象一个能够快速操作的查询/模式.

有任何想法吗?

(我更希望保持数据库架构和查询通用(不依赖于供应商).但是,如果一个供应商使这很容易,我很乐意使用MS SQL或MySQL.

Hen*_*ing 13

怎么样:

select count(*)+1 as rank from leaderboard  
where score > (select score from leaderboard where userid = ?)
Run Code Online (Sandbox Code Playgroud)

您还需要分数列上的索引.

这样做count()+1score > (...)会给你即使当多个玩家具有相同的比分准确行列; 这样做count()score >= (...)不会.