2017-01-23 44 views
0

一個MySQL表看起來是這樣的:在排序結果集中選擇的行數有效的方式(MySQL的)

Item Score 
----------- 
A  3.646 
B  2.775 
C  6.383 
D  0.122 
... 

有上Score列的索引。我希望按降序順序選擇項目,並且我也想知道項目的排名(即結果集中特定行的編號)。在這個例子中,期望的結果是:

Item Rank 
---------- 
C  1 
A  2 
B  3 
D  4 

有沒有一種有效的方式來做到這一點在大表上?如果可能,我想避免子選擇。 PS:是的,結果集中的排名當然總是1,2,3 ......但不是,我不能在應用程序中推導出這些結果,因爲這些結果將在DB中進一步處理,沒有返回到應用程序。

回答

2
SET @rank=0; 
SELECT Item, @rank:[email protected]+1 AS rank 
FROM yourTable 
ORDER BY Score DESC; 

該選項使用會話變量來模擬行號功能,因爲MySQL不支持分析功能。

這是一個link to a helpful tutorial,它討論了更深入地模擬MySQL中的行號。

+0

哈哈,你打我..我正要其實寫了相同的答案 – sumit

+1

@sumit,很多人[拍我們兩個都是這樣的](http://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select):-) –

+0

如果真的那麼簡單,會覺得很尷尬:)我想的太複雜了...我不知道在ORDER BY之後會發生添加 – travelboy

3

單語句回答是:

select 
    item, 
    @rank := @rank + 1 rank 
from (
    SELECT * 
    FROM yourTable 
    ORDER BY Score DESC 
) t cross join (select @rank:=0) t2 

無子查詢:

SELECT Item, @rank := if(@rank is null, 1, @rank+1) AS rank 
FROM yourTable 
ORDER BY Score DESC;