在MySQL中实现Rank⾼级排名函数
在MySQL中实现Rank⾼级排名函数
前⾔
在MYSQL的最新版本MYSQL8已经⽀持了排名函数RANK,DENSE_RANK和ROW_NUMBER。但是在就得版本中还不⽀持这些函数,只能⾃⼰实现。实现⽅法主要⽤到了条件判断语句(CASE WHEN或IF)和添加临时变量。
以前的MySQL中没有排名函数,当我们需要查询排名时,只能使⽤MySQL数据库中的基本查询语句来查询排名,下⾯有3种具体的实现。(ps:⾮特殊情况,实际开发尽量使⽤Redis的sortset去实现排⾏。)
⽤例表
接下来的排⾏实现都采⽤这个表的数据举例。(ps:建议直接跳过,只是⽅便测试⽽已。)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS =0;
DROP TABLE IF EXISTS`user`;
CREATE TABLE`user`(
`id`int(0)NOT NULL AUTO_INCREMENT,
`name`varchar(25)CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`age`int(0)NULL DEFAULT NULL,
PRIMARY KEY(`id`)USING BTREE
)ENGINE=InnoDB CHARACTER SET= utf8mb4 COLLATE= utf8mb4_general_ci ROW_FORMAT = Dynamic;
INSERT INTO`user`VALUES(1,'a',0);
INSERT INTO`user`VALUES(2,'b',41);
INSERT INTO`user`VALUES(3,'c',27);
INSERT INTO`user`VALUES(4,'d',9);
INSERT INTO`user`VALUES(5,'e',26);
INSERT INTO`user`VALUES(6,'f',43);
INSERT INTO`user`VALUES(7,'g',16);
INSERT INTO`user`VALUES(8,'h',10);
INSERT INTO`user`VALUES(9,'i',5);
INSERT INTO`user`VALUES(10,'j',53);
INSERT INTO`user`VALUES(11,'k',12);
INSERT INTO`user`VALUES(12,'l',21);
INSERT INTO`user`VALUES(13,'m',8);
INSERT INTO`user`VALUES(14,'n',39);
INSERT INTO`user`VALUES(15,'o',53);
INSERT INTO`user`VALUES(16,'p',5);
INSERT INTO`user`VALUES(17,'q',60);
mysql高级教程视频
INSERT INTO`user`VALUES(18,'r',44);
INSERT INTO`user`VALUES(19,'s',41);
INSERT INTO`user`VALUES(20,'t',13);
INSERT INTO`user`VALUES(21,'u',2);
INSERT INTO`user`VALUES(22,'v',32);
INSERT INTO`user`VALUES(23,'w',32);
INSERT INTO`user`VALUES(24,'x',4);
INSERT INTO`user`VALUES(25,'y',53);
INSERT INTO`user`VALUES(26,'z',37);
SET FOREIGN_KEY_CHECKS =1;
1.在MySQL中实现普通排名
对应Orcale的ROW_NUMBER函数连续排名,即使相同的值,依旧按照连续数字进⾏排名。
SELECT id , name , age ,@rank :=@rank+1AS ageRank
FROM user,(SELECT@rank :=0) s
ORDER BY age desc
#⽤函数
SELECT id , name , age ,
ROW_NUMBER()OVER(ORDER BY age DESC)AS ageRank
FROM user;
2.在MySQL中实现并列连续序号排名
对应Orcale的DENSE_RANK并列连续排序,并列即相同的值,相同的值保留重复名次,遇到下⼀个不同值时,依然按照连续数字排名。
SELECT id , name , age ,
CASE
WHEN@ageValue= age THEN
@rank
WHEN@ageValue := age THEN
@rank :=@rank+1
END AS ageRank
FROM user,(SELECT@rank :=0,@ageValue :=NULL) s
ORDER BY age desc
#⽤函数
SELECT id , name , age ,
DENSE_RANK()OVER(ORDER BY age DESC)AS ageRank
FROM user;
3.在MySQL中实现并列⾮连续序号排名
对应Orcale的RANK并列跳跃排名,并列即相同的值,相同的值保留重复名次,遇到下⼀个不同值时,跳跃到总共的排名。
SELECT id , name , age , ageRank
FROM(
SELECT id , name , age ,
@rank :=IF(@ageValue= age ,@rank,@realRank)AS ageRank ,
@realRank :=@realRank+1 realRank,
@ageValue := age ageValue
FROM user,(SELECT@rank :=0,@ageValue :=NULL,@realRank :=1) s ORDER BY age desc
)t
#⽤函数
SELECT id , name , age ,
RANK()OVER(ORDER BY age DESC)AS ageRank
FROM user;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。