2013-03-10 34 views
2

我有一個MySQL表是這樣的:MySQL查詢一列進行排序,併產生其排名(相當於排名OVER PARTITION甲骨文)

id | points | rank | league_id 
______________________________ 
1 | 84  | 0 | 1 
2 | 55  | 0 | 1 
3 | 104 | 0 | 1 
4 | 123 | 0 | 2 

我想做到的是以下幾點:

id | points | rank | league_id 
______________________________ 
1 | 84  | 2 | 1 
2 | 55  | 3 | 1 
3 | 104 | 1 | 1 
4 | 123 | 1 | 2 

所以 - 使用rank列來存儲基於points_id分組數的點數。這可能看起來有點多餘,但我需要它來達到我的目的(這是一個幻想體育網站,擁有一個排名欄大大簡化了很多PHP代碼,並減少了整個腳本中所需查詢的數量)。

我知道顯而易見的解決方案 - 遍歷行,通過league_id分組並逐個更新排名。我想知道的是,是否有更高效的解決方案?

+0

我希望你不介意,我改變了你的問題的標題,我覺得它回答了一個很常見從oracle切換到mysql時出現問題,值得指出。如果你不喜歡它可以隨意編輯它 – Sebas 2013-03-10 17:52:50

+0

沒問題,很樂意幫助別人。 – jovan 2013-03-10 19:33:51

回答

2

OTOH,所以測試首先在扔掉的數據庫,準備裝載備份:

SET @rank = 1; 
    SET @league = 0; 

    UPDATE tablename 
    SET 
     rank = @rank := IF(@league = league_id,@rank+1,1), 
     league_id = @league := league_id 
    ORDER BY league_id,points DESC; 
+0

'ORDER BY league_id,points DESC' - 所以最大的一點就是'rank 1'。 – 2013-03-10 17:22:18

+0

@JW。你當然是對的,對我來說是一個疏忽,把它添加到答案中;) – Wrikken 2013-03-10 17:24:08

+0

太好了,像魅力一樣工作,謝謝。 – jovan 2013-03-10 17:26:28