MySQL中没有Rank排名函数,我们可以利用基础而简单的查询语句其来达到Rank函数一样的高级排名效果。
我们使用如下数据:
CREATE TABLE `rank_test` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL DEFAULT '',
`age` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (1, '张三', 67);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (2, '李四', 67);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (3, '王五', 90);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (4, '赵本山', 80);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (5, '赵丽颖', 18);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (6, '李逍遥', 24);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (7, 'Krs', 25);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (8, 'Wil', 26);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (9, 'Gee', 23);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (10, 'Per', 19);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (11, 'Tom', 20);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (12, 'Ae', 20);
INSERT INTO `rank_test`(`id`, `name`, `age`) VALUES (13, 'Vio', 20);
age升序排列(age相同时,排名继续增加)
SELECT
id,
NAME,
age,
@rank := @rank + 1 AS rank
FROM
rank_test a,
( SELECT @rank := 0 ) b
ORDER BY
age ;
SELECT
id,
NAME,
age,
@rank := @rank + 1 AS rank
FROM
rank_test a,
( SELECT @rank := 0 ) b
ORDER BY
age DESC;
age升序排列(age相同时,排名相同;但是到下一个age不同时,排名不跳级,继续+1) (case…when…then)
SELECT
id,
NAME,
age,
CASE
WHEN @prev_age = age THEN
@rank
WHEN @prev_age := age THEN
@rank := @rank + 1
END AS rank
FROM
rank_test a,
( SELECT @rank := 0, @pre_age := 0 ) b
ORDER BY
age;
age升序排列(age相同时,排名相同;但是到下一个age不同时,排名不跳级,继续+1),示例二if(a,b,c):
age升序排列(age相同时,排名相同;但是到下一个age不同时,排名跳级+n)
SELECT
id,
NAME,
age,
@rank :=
IF
( @prev_age = age, @rank, @inc_rank ) AS rank,
@inc_rank := @inc_rank + 1,
@prev_age := age
FROM
rank_test a,
( SELECT @rank := 0, @pre_age := 0, @inc_rank := 1 ) b
ORDER BY
age;
SELECT
c.id,
c.NAME,
c.age,
c.rank
FROM
(
SELECT
id,
NAME,
age,
@rank :=
IF
( @prev_age = age, @rank, @inc_rank ) AS rank,
@inc_rank := @inc_rank + 1,
@prev_age := age
FROM
rank_test a,
( SELECT @rank := 0, @pre_age := 0, @inc_rank := 1 ) b
ORDER BY
age
) c;
参考链接https://blog.csdn.net/justry_deng/article/details/80597916