使用 MySQL 将排名变量添加到数据库

Add ranking variable to database with MySQL

我有一个具有以下结构的数据库:

ID   GROUP   VALUE   RANK
2      1      999     0
1      1      888     0
3      2      777     0
4      2      111     0 

我需要根据“VALUE”列对 ID 进行排名并按“GROUP”列进行分组来更新“RANK”列。基本上,在上面的示例中,我应该以:

ID   GROUP   VALUE   RANK
2      1      999     1
1      1      888     2
3      2      777     1
4      2      111     2 

我尝试了另一个答案并稍微更改了查询:

SET @r=0;
UPDATE `table` SET `RANK` = @r:= (@r+1) ORDER BY `VALUE` DESC;

SET @r=0;
UPDATE `table` SET `RANK` = @r:= (@r+1) PARTITION BY `GROUP` ORDER BY `VALUE` DESC;

但这会引发错误。或者,这种方法产生正确的排名:

SELECT `ID`,
    RANK() OVER (PARTITION BY `GROUP` ORDER BY `VALUE`) as `RANK`
FROM table;

但它不会更新数据库中的“RANK”列。与第一个解决方案相比,我更喜欢第二个解决方案,但是如何将查询的输出保存到 RANK 列?

UPDATE 语句中将 table 加入到您的最后一个查询中(也在 ORDER BY 子句中使用 DESC):

UPDATE tablename t
INNER JOIN (
  SELECT id, RANK() OVER (PARTITION BY `GROUP` ORDER BY `VALUE` DESC) AS `RANK`
  FROM tablename
) r ON r.ID = t.ID
SET t.`RANK` = r.`RANK`;