2015-11-06 30 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()'的。 –