MySQL排名问题
表内容信息如下:

对成绩进行排名,相同成绩的名次相同,有两种方式,推荐第二种:
### 方法1:
mysql> set @rank:=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set @cj:=null;
Query OK, 0 rows affected (0.00 sec)
mysql> select id,name,score,case when @cj=score then @rank when @cj:=score then @rank:=@rank+1 end as rank from a order by score;
+----+------+-------+------+
| id | name | score | rank |
+----+------+-------+------+
| 1 | aa | 70 | 1 |
| 4 | dd | 75 | 2 |
| 3 | cc | 85 | 3 |
| 7 | gg | 85 | 3 |
| 2 | bb | 90 | 4 |
| 6 | ff | 98 | 5 |
| 5 | ee | 100 | 6 |
+----+------+-------+------+
7 rows in set (0.00 sec)
缺点是每次执行都需要重置@rank和@cj,不然排名会一直增加下去。
### 方法2:
mysql> select id,name,score,case when @cj=score then @rank when @cj:=score then @rank:=@rank+1 end as rank from a ,(select @rank:=0,@cj:=null) as b order by score;
+----+------+-------+------+
| id | name | score | rank |
+----+------+-------+------+
| 1 | aa | 70 | 1 |
| 4 | dd | 75 | 2 |
| 3 | cc | 85 | 3 |
| 7 | gg | 85 | 3 |
| 2 | bb | 90 | 4 |
| 6 | ff | 98 | 5 |
| 5 | ee | 100 | 6 |
+----+------+-------+------+
7 rows in set (0.01 sec)
方法2仅需要一条SQL,并且不需要重置@rank和@cj的值。
理解了很简单,但是如果没有思路这个问题还是比较有难度。
再就是还有一种方法,但是这种方法也是不推荐使用(每一个排名都要扫描全表一次,计划任务):
select t.id,t.name,t.score,(select count(s.score)+1 from a s where s.score>t.score) rank from a t order by t.score desc;
查询结果:

本文探讨了在MySQL中对成绩进行排名的两种方法。第一种方法需要重置变量,而第二种方法只需一条SQL,避免了重置的需要。虽然理解起来简单,但在没有思路时可能颇具挑战。此外,还提及了一种不推荐的全表扫描方法。
809

被折叠的 条评论
为什么被折叠?



