我有一个像这样的 MySQL 表:
id | points | rank | league_id
______________________________
1 | 84 | 0 | 1
2 | 55 | 0 | 1
3 | 104 | 0 | 1
4 | 123 | 0 | 2
我想要完成的任务如下:
id | points | rank | league_id
______________________________
1 | 84 | 2 | 1
2 | 55 | 3 | 1
3 | 104 | 1 | 1
4 | 123 | 1 | 2
因此 - 使用排名列来存储基于积分的排名,并按 league_id 分组。这可能看起来多余,但我需要它来实现我的目的(它用于幻想体育网站,并且具有排名列大大简化了许多 PHP 代码并减少了整个脚本中所需查询的数量)。
我知道一个显而易见的解决方案 - 迭代行,按 league_id 分组并逐一更新排名。我想知道是否有更有效的解决方案?
最佳答案
OTOH,所以首先在一次性数据库上进行测试,准备加载备份:
SET @rank = 1;
SET @league = 0;
UPDATE tablename
SET
rank = @rank := IF(@league = league_id,@rank+1,1),
league_id = @league := league_id
ORDER BY league_id,points DESC;
关于MySQL 查询按一列排序并生成其排名(相当于 RANK OVER PARTITION oracle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15325032/