MySQL 查询按一列排序并生成其排名(相当于 RANK OVER PARTITION oracle)

标签 mysql ranking

我有一个像这样的 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/

相关文章:

php mysql 连接多个表

带有全文索引的 mysql View

PostgreSQL:有效地获得序数排名(行索引?)

algorithm - 是否存在一种无需分支即可计算位矩阵秩的算法?

mysql - 使涉及小表和大表的条件 MySQL 连接变得高效

php - 使用索引 INT 或索引 TIMESTAMP 更快地在大表中进行 MySQL SELECT

mysql - 为动态文档创建 SQL 表布局

MySQL排序添加渐进id

mysql - 如何使用 MySQL 存储过程计算排名?

用于计算子组中的排名和中位数的 SQL 排名查询