MySQL成绩排名的简单实现

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

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;

查询结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值