2015-11-06 32 views
1

我們使用以下查詢計算了排名。使用更新查詢計算mysql中的排名

set @rank = 0; 
Update rank_table 
    set position= (select @rank := @rank + 1) 
    order by points DESC, points_new DESC, points_old DESC; 

然後按順序計算排名。

例如。

enter image description here

我想其中具有相同條件的ID應分配相同的排名。 所以說, 這裏id 1和2有相同的標準,那麼應該有位置= 1,然後id 3應該有位置= 3。 不喜歡電流。 目前 - >編號1:位置1,ID 2:位置2,ID 3:位置3 但爲ID 1和2具有它應該是相同的數據..

編號1:位置1,ID 2:位置1,Id 3:位置3

感謝您的幫助。

回答

4

你想要的是技術上rank()而不是row_number()。這是一個痛苦的事情,但可能:

set @rn := 0; 
set @rank := 0; 
set @p := -1; 
Update rank_table 
    set position = if(@rn := @rn + 1, 
         if(@p = points, @rank, 
          if(@p := points, @rank := @rn, @rank := @rn) 
         ), 
         NULL -- never should happen 
        ) 
    order by points DESC, points_new DESC, points_old DESC; 

,因爲你需要同時計算等級和行號這是棘手 - 排名保持不變,然後它必須「跳」到該行號。

+0

很好.. 它的工作。非常感謝。被卡住了。 – Beena

+0

你能解釋一下這些行是幹什麼的嗎? 'if(@p:= points,@rank:= @rn,@rank:= @rn)' – Beena

+1

@Bini。 。 。我不明白你的評論。 ':='給變量賦值。 if()是一個條件函數。這些是MySQL語言的基本部分。這是如何使用它們在其他數據庫中實現相當於'rank()'的。 –