有效地在sql数据库中查找条目的“排名”

时间:2014-02-11 09:15:08

标签: php mysql sql

我有一个与以下结构类似的数据库:

http://www.sqlfiddle.com/#!2/6c5239

目前在.php脚本中查找我所运行的人的等级

SELECT * FROM people ORDER BY score DESC;

并循环遍历结果,每行递增一个"rank"变量,直到我点击所需名称,输出结果并打破循环。

我觉得这是一种非常低效的获取排名的方法,既可以让网络服务器循环访问数据,也可以让SQL数据库返回整个表格。

有没有更简单的方法来执行此操作,可能所有这些都是通过不会过多地对SQL服务器征税的SQL语句?

1 个答案:

答案 0 :(得分:0)

select * from (
    select
    p.*,
    @rank:=IF(@prev_score != score, @rank + 1, @rank) as rank,
    @prev_score := score
    from
    people p
    , (select @rank:=1, @prev_score:=null) var_init
    order by score desc
) sq where rank = 5;

这是针对MySQL的。您的问题被标记为MySQL,但在您的sqlfiddle中您指定了SQL Server。

对于SQL Server,它将是:

; with cte as (
select
p.*,
rank() over (order by score desc) as my_rank
from
people p
) select * from cte where my_rank = 5;

更新:

select * from (
    select
    p.*,
    @rank:=IF(@prev_score != score, @rank + 1, @rank) as rank,
    @prev_score := score
    from
    people p
    , (select @rank:=1, @prev_score:=null) var_init
    order by score desc
) sq where name = 'whatever';