我試圖存儲用戶的排名基於分數,所有它一張桌子,並跳過隊伍,當有領帶。例如:簡單的MySQL更新排名與關係
ID Score Rank
2 23 1
4 17 2
1 17 2
5 10 4
3 2 5
用戶每次的分數被更新,整個表中的排名也必須更新,所以得分更新後,下面的查詢運行:
SET @rank=0;
UPDATE users SET rank= @rank:= (@rank+1) ORDER BY score DESC;
但這不支持關係,或者在關係之後跳過排名數字。
我想在儘可能少的查詢中實現這種重新排名並且沒有聯接(因爲它們看起來相當耗時)。
我能夠通過增加兩列,以獲得期望的結果 - last_score和tie_build_up - 用下面的代碼:
SET @rank=0, @last_score = null, @tie_build_up = 0;
UPDATE users SET
rank= @rank:= if(@last_score = score, @rank, @[email protected]_build_up+1),
tie_build_up= @tie_build_up:= if(@last_score = score, @tie_build_up+1, 0),
last_score= @last_score:= score, ORDER BY score DESC;
我不希望這些額外的列,但我不能讓單查詢工作沒有他們。
任何想法?
謝謝。
+1,這是我會做的。除非絕對必要,否則存儲計算列似乎不正確。計算列的性能可能比存儲更好,因爲寫入不需要鎖定。 – 2011-12-31 04:25:32