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;