我有一个与以下结构类似的数据库:
http://www.sqlfiddle.com/#!2/6c5239
目前在.php
脚本中查找我所运行的人的等级
SELECT * FROM people ORDER BY score DESC;
并循环遍历结果,每行递增一个"rank"
变量,直到我点击所需名称,输出结果并打破循环。
我觉得这是一种非常低效的获取排名的方法,既可以让网络服务器循环访问数据,也可以让SQL数据库返回整个表格。
有没有更简单的方法来执行此操作,可能所有这些都是通过不会过多地对SQL服务器征税的SQL语句?
答案 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';