Mysql 中没有像 Oracle 中那样的 Rank 函数来实现查询的排名排序,但是我们可以用一
些基础查询语句来实现同样的效果。

先创建一个表来作为例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
drop table if exists `post`;
create table `post`(
id int(11) not null AUTO_INCREMENT,
url VARCHAR(512) not null default '' COMMENT '地址',
pv int(11) not null default 0 COMMENT '访问量',
primary key(`id`)
) engine=InnoDB default charset=utf8mb4 COMMENT '博客';
INSERT INTO `post` (`url`, `pv`) VALUES
('/p/1', 22),
('/p/2', 21),
('/p/3', 50),
('/p/4', 5),
('/p/5', 15),
('/p/6', 23),
('/p/7', 45),
('/p/8', 35),
('/p/9', 20);

我们想要对 pv 字段进行倒序排名

1
select @rank := @rank +1 as rank, url, pv from `post` p, (select @rank := 0) r order by pv desc;

如果你按照我上边的语句执行,你会得到如下的结果

1
2
3
4
5
6
7
8
9
1    /p/3    50
2 /p/7 45
3 /p/8 35
4 /p/6 23
5 /p/1 22
6 /p/2 21
7 /p/9 20
8 /p/5 15
9 /p/4 5

有结果来看,我们已经得到了想要的结果,下面我们来看看怎么实现的。

首先简单说下 Mysql 中的变量,需要以 @ 开头,及 @rank,想要给变量赋值分两种。
SET 语句

1
2
set @name = 'wxnacy';
select @name;

SELECT 语句

1
select @name := 'wxnacy';

两者的区别在于 set 命令需要两条命令查询,select 命令中使用 := 赋值
@rank := @rank + 1 就是在查询语句中达到自增的目的,也就变相的实现了 rank 函数。

03-16 18:59