Mysql 根据列在结果中的位置更新列

Mysql 根据列在结果中的位置更新列,mysql,sql,Mysql,Sql,我有一个查询,它循环遍历每个结果并更新一列: SET @counter = 0; UPDATE users SET rank_level = @counter := @counter + 1 ORDER BY level DESC; SELECT rank_level, level FROM users ORDER BY rank_level ASC; 哪些产出: 但是我要做的只是在级别值改变时增加变量。因此,在具有相同级别的两行所在的位置,它们的秩也将相同,即8 有什么想法吗?谢谢。ran

我有一个查询,它循环遍历每个结果并更新一列:

SET @counter = 0;
UPDATE users SET rank_level = @counter := @counter + 1 ORDER BY level DESC;
SELECT rank_level, level FROM users ORDER BY rank_level ASC;
哪些产出:

但是我要做的只是在级别值改变时增加变量。因此,在具有相同级别的两行所在的位置,它们的秩也将相同,即8

有什么想法吗?谢谢。

rank()
在MySQL中有点棘手。一种方法是使用相关子查询:

select u.*,
       (select count(*) + 1
        from users u2
        where u2.level < u.level
       ) as rank
from users u;
使用变量进行排名相当棘手(
row\u number()
densite\u rank()
更容易),因为它需要三个变量。以下是
选择
版本:

select u.*,
       (@r := if(@l = level,
                 if(@rn := @rn + 1, @r, @r)
                 if(@l := level,
                    @rn := @rn + 1, @rn := @rn + 1
                   )
                )
       ) as ranking
from users u cross join
     (select @l := -1, @rn : = 0, @r := 0) params
order by level;

所以最后我还是这样说的:

SET @prev_value = NULL;
SET @rank_count = 0;

UPDATE users SET rank_level = CASE
  WHEN @prev_value = level THEN @rank_count
  WHEN @prev_value := level THEN @rank_count := @rank_count + 1
END
ORDER BY level DESC;

根据这个答案:

我标记为重复的问题的第二个答案保留了答案。它基本上是windowed rank()函数的MySQL版本。我不确定这会被认为是重复的——看到了很多更糟糕的问题和类似的答案。这应该会有帮助:@sgeddes如果你真的相信这个问题是不同的,并且我指出的答案不适用,那么你有权重新提出这个问题。不过,我相信我的评估是正确的。它与另一个是select略有不同,我的是一个更新,但逻辑相同。我重新打开了这个问题,因为其他问题的两个主要答案实现了
行数()
密集排列()
,但不是
排列()
SET @prev_value = NULL;
SET @rank_count = 0;

UPDATE users SET rank_level = CASE
  WHEN @prev_value = level THEN @rank_count
  WHEN @prev_value := level THEN @rank_count := @rank_count + 1
END
ORDER BY level DESC;