2014-02-11 55 views
0

我也有類似的結構到數據庫:查找在SQL數據庫條目的「排名」有效

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

目前在.php腳本查找的人的等級我跑

SELECT * FROM people ORDER BY score DESC;

並遍歷結果,每行增加一個"rank"變量,直到我點擊所需的名稱,輸出結果並打破循環。

我覺得這是一個非常低效的方式來獲得一個名次,既爲網絡服務器通過數據,也爲SQL數據庫返回的整個表必須循環。

是否有更簡單的方法來做到這一點,可能所有通過不含稅SQL服務器太多SQL語句?

+0

我不太確定你的方法是一個糟糕的一個。但是你可以在SQL中使用變量來高效地執行此操作以跟蹤等級。 – Strawberry

+0

如果你不需要做{SELECT * FROM}不要使用它。選擇需要查詢的列將爲數據庫帶來速度。我不知道你是否需要查詢所有列。 – Mubo

回答

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; 

UPDATE:

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'; 
+0

我的壞,SQL小提琴現在應該修復。你的代碼可以按等級查找,但我怎麼才能通過用戶名找到並返回他們的排名?例如,我會找出'fred'與所有其他條目(按分數)的關係。 – johnnyb

+0

查看更新的答案。 – fancyPants

+0

是完美的,這工作!謝謝你,我很感激。 – johnnyb