用于存储排名位置的MySQL更新语句

use*_*762 11 mysql sql ranking sql-update

我正试图绕过一个查询而我无法理解它.如果有人给我指针,我将不胜感激.作为我想要实现的一个简单示例,我在数据库中有这些记录

Score|Ranking
-------------
100  |0
200  |0
300  |0
Run Code Online (Sandbox Code Playgroud)

我希望排名字段包含1,2,3根据谁获得最高分,所以结果应该是:

Score|Ranking
-------------
100  |3
200  |2
300  |1
Run Code Online (Sandbox Code Playgroud)

目前,我正在为所有这些记录做下一个循环,但实际上这可能是几千 - 这可能需要永远!有没有人对魔术查询有一个想法,可以一次性做到这一点?

qua*_*oup 18

这是一种方法:

SET @r=0;
UPDATE table SET Ranking= @r:= (@r+1) ORDER BY Score DESC;

/* use this if you just want to pull it from the db, but don't update anything */
SET @r=0;
SELECT *, @r:= (@r+1) as Ranking FROM table ORDER BY Score DESC;
Run Code Online (Sandbox Code Playgroud)

  • 在某种意义上它是自包含的,是的; 但那是因为他在SELECT子查询中设置了@rownum.我认为这看起来更加混乱. (2认同)

DOK*_*DOK 6

在MySQL中,您可以使用row_number.

以下是在以下位置使用它的示例SELECT:

select @rownum:=@rownum+1 ‘rank’, p.* 
from player p, (SELECT @rownum:=0) r 
order by score desc;
Run Code Online (Sandbox Code Playgroud)

如果您INSERT INTO使用SELECT这样的,您将获得您的排名.

  • 这在哪里更新数据库中的值? (11认同)

Jas*_*ary 5

这会创建一个内联更新语句,根据变量对您的玩家进行排名@rc.我在非常类似的情况下多次使用它,它运行良好并且保持在数据库端.

SET @rc = 0;
UPDATE players JOIN (SELECT @rc := @rc + 1 AS rank, id FROM players ORDER BY rank DESC)
AS order USING(id) SET players.rank = order.rank;
Run Code Online (Sandbox Code Playgroud)

id假定是您的players表的主键.