mysql rank 排序

scores表
+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
按照分数排名
+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

1:思路

首先定义 初始排名的值的0, 然后 查询的每一条数据 @rank这个变量就会+1。 
这就是一个比较简单的排名, 但是你会发现 score数值一样的话,排名应该是一样的,因此这个并不正确。

mysql> set @rank = 0;
mysql> select score, (@rank := @rank + 1) as rank from scores order by score desc;
+-------+------+
| score | rank |
+-------+------+
|  4.00 |    1 |
|  4.00 |    2 |
|  3.85 |    3 |
|  3.65 |    4 |
|  3.65 |    5 |
|  3.50 |    6 |
+-------+------+
6 rows in set (0.00 sec)
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2:比较前一个数值

mysql> set @rank = 0; 

Query OK, 0 rows affected (0.00 sec)

mysql> set @prev = null;
Query OK, 0 rows affected (0.00 sec)

mysql> select score, if (@prev = score, @rank ,@rank := @rank + 1 ) as Rank , (@prev := score) as tmp from scores order by score desc;
+——-+——+——+

| score | Rank | tmp |
+——-+——+——+

| 4.00 | 1 | 4.00 |
| 4.00 | 1 | 4.00 |
| 3.85 | 2 | 3.85 |
| 3.65 | 3 | 3.65 |
| 3.65 | 3 | 3.65 |
| 3.50 | 4 | 3.50 |
+——-+——+——+

6 rows in set (0.00 sec)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值