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

时间:2013-03-10 17:08:30

标签: 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进行分组并逐个更新排名。我想知道的是,有更有效的解决方案吗?

1 个答案:

答案 0 :(得分:2)

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;