2016-07-27 90 views
1

我試圖執行一個查詢回填的排名,對於每個用戶ID,排名得分和回填等級字段,使MYSQL更新語句由每個ID

id | score | rank 
1 | 100 | 0 
1 | 200 | 0 
1 | 300 | 0 
2 | 100 | 0 
2 | 200 | 0 
3 | 200 | 0 

將成爲

id | score | rank 
1 | 100 | 3 
1 | 200 | 2 
1 | 300 | 1 
2 | 100 | 2 
2 | 200 | 1 
3 | 200 | 1 

我看到了類似的問題在這裏 MySQL update statement to store ranking positions

然而,在我的情況,我怎麼能「通過ID組」做每個ID?

+0

有沒有存儲等級的原因;它可以隨時計算。 – user3741598

回答

1

它可能不是最漂亮的方式,但你可以很容易地做一些事情,如:

set @rank = 0; 
set @prev = 0; 

select id, score, IF (id = @prev, @rank := @rank + 1, @rank := 1), @prev := id 
from scores 
order by id, score; 

我猜你想要的更新語句,以及,這將是:

set @rank = 0; 
set @prev = 0; 

update scores 
set rank = IF(id = @prev, @rank := @rank + 1, @rank := 1), 
id = (@prev := id) 
order by id, score; 
+0

我喜歡你的想法使用previous_id技巧!但是如果表格有數百萬條記錄,不知道該如何表現。也許如果我在(id +分數)上創建索引,性能應該不錯? –

+0

@FreyaRen「好」是非常相對的。我不知道在什麼情況下查詢將被使用,或表的確切結構,所以我不能就此提出建議。我只能說,更新「數百萬條記錄」不會很快 - 不管你做什麼。 – rlanvin