解决MySQL5和8的成绩排序问题

MySQL8.0排序问题

1. 创建表

CREATE TABLE `stu` (
  `id` int NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `score` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;



INSERT INTO `stu` VALUES (1, 'zs', 90);
INSERT INTO `stu` VALUES (2, 'ls', 90);
INSERT INTO `stu` VALUES (3, 'ww', 85);
INSERT INTO `stu` VALUES (4, 'zl', 80);
INSERT INTO `stu` VALUES (5, 'tq', 60);

2. 排序

ROW_NUMBER():顺序排序——1、2、3、4、5

SELECT
	id,
	name,
	score,
	row_number ( ) over ( ORDER BY score desc ) as sort
FROM
	stu s 
ORDER BY
	score
	desc

RANK():并列排序,跳过重复序号——1、1、3、4、5

SELECT
	id,
	name,
	score,
	rank ( ) over ( ORDER BY score desc ) as sort
FROM
	stu s 
ORDER BY
	score
	desc

DENSE_RANK():并列排序,不跳过重复序号——1、1、2、3、4

SELECT
	id,
	name,
	score,
	dense_rank ( ) over ( ORDER BY score desc ) as sort
FROM
	stu s 
ORDER BY
	score
	desc

MySQL5.0排序问题

顺序排序——1、2、3、4、5

SELECT id, name,score, @curRank := @curRank + 1 AS rk
FROM stu, (
SELECT @curRank := 0
) r
ORDER BY score desc;

并列排序,跳过重复序号——1、1、3、4、5

SELECT
	id,
	NAME,
	score,
	rk 
FROM
	(
	SELECT
		id,
		NAME,
		score,
		@curRank :=
	IF
		( @prevRank = score, @curRank, @incRank ) AS rk,
		@incRank := @incRank + 1,
		@prevRank := score 
	FROM
		stu,
		( SELECT @curRank := 0, @prevRank := NULL, @incRank := 1 ) r 
	ORDER BY
	score DESC 
	) s;

并列排序,不跳过重复序号——1、1、2、3、4

SELECT
	id,
	NAME,
	score,
CASE
		WHEN @prevRank = score THEN
		@curRank 
		WHEN @prevRank := score THEN
		@curRank := @curRank + 1 
	END as rk
FROM
	stu,
	( SELECT @curRank := 0, @prevRank := NULL ) as rk
ORDER BY
	score desc
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值