MySQL中实现rank排名查询

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 ;

MySQL中实现rank排名查询_第1张图片
age降序排列(age相同时,排名继续增加)

SELECT
		id,
		NAME,
		age,
		@rank := @rank + 1 AS rank 
	FROM
		rank_test a,
		( SELECT @rank := 0 ) b 
	ORDER BY
		age DESC;

MySQL中实现rank排名查询_第2张图片
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;

MySQL中实现rank排名查询_第3张图片
age升序排列(age相同时,排名相同;但是到下一个age不同时,排名不跳级,继续+1),示例二if(a,b,c):
MySQL中实现rank排名查询_第4张图片
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;

MySQL中实现rank排名查询_第5张图片
如果嫌查出来的列太多了,可以再对此结果进行select

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;

MySQL中实现rank排名查询_第6张图片
参考链接https://blog.csdn.net/justry_deng/article/details/80597916

你可能感兴趣的:(mysql)