网站建设需要多少人,互联网公司的网络运营,钢构网架加工厂,哪个网站可以做竖屏文章目录 前言一、数据库表结构和样例数据二、排名操作1.普通排名2.无间隔排名3.有间隔排名 总结 前言 最近业务上碰到这样一个需求#xff0c;需要对表按照某一个字段进行排序#xff0c;并且将得到的排名写入对应的排名字段。这个需求于我而言确实没有遇到过#xff0c;好… 文章目录 前言一、数据库表结构和样例数据二、排名操作1.普通排名2.无间隔排名3.有间隔排名 总结 前言 最近业务上碰到这样一个需求需要对表按照某一个字段进行排序并且将得到的排名写入对应的排名字段。这个需求于我而言确实没有遇到过好在试着摸索一番得以解决故写博客记录一下。 一、数据库表结构和样例数据 本文中我们创建一张简单的成绩表来进行测试表的结构和数据也很简单这里不再赘述直接放代码
CREATE TABLE grades (id int(11) NOT NULL AUTO_INCREMENT,grade int(11) DEFAULT NULL,rankNum int(11) DEFAULT NULL,PRIMARY KEY (id)
) ENGINEInnoDB AUTO_INCREMENT9 DEFAULT CHARSETutf8mb4;INSERT into grades (grade) VALUE (87);
INSERT into grades (grade) VALUE (100);
INSERT into grades (grade) VALUE (95);
INSERT into grades (grade) VALUE (87);
INSERT into grades (grade) VALUE (45);
INSERT into grades (grade) VALUE (67);
INSERT into grades (grade) VALUE (75);
INSERT into grades (grade) VALUE (87);创建表之后我们插入8条数据进行测试当然我们的排名字段暂时是为空的最终效果如图
二、排名操作
1.普通排名 普通排名就是指所有数据按其规则进行排序尽管出现数据相同的情况也依然存在先后顺序。 UPDATEgrades g1 INNER JOIN (SELECT id, grade,rank : rank 1 AS ranking
FROM(SELECT rank : 0) r,grades
ORDER BYgrade DESC) g2
ON g1.id g2.id SET g1.rankNum g2.ranking;运行结果如图我们也能看出排名确实是按照降序排列而且分数相同的排名依然是有序的
2.无间隔排名 无间隔排名就是指当存在相同数据时我们希望它们的排名是一样的就比如223这组数据最终的排名效果是112其中3这个数据的排名并没有因为前面占有两个数据而变成3这我们称无间隔。 UPDATEgrades g1 INNER JOIN (SELECT id, grade,(CASEWHEN prevRank grade THEN currankWHEN prevRank : grade THEN currank : currank 1END) AS ranking
FROM(SELECT prevRank : NULL, currank : 0) r,grades
ORDER BYgrade DESC) g2
ON g1.id g2.id SET g1.rankNum g2.ranking;运行结果如图我们可以看出分数相同的87排名都是一样的而在87之后的75的排名依然是4没有跳跃 3.有间隔排名 这个排名规则是我业务上真正需要的所谓的有间隔就是比如之前的例子223那么最后的排名结果是113这里的数据3不再是2了会因为占有问题而跳跃。 UPDATEgrades g1 INNER JOIN (SELECT id, grade,currank : IF(prevRank grade, currank, rowrank) AS ranking,rowrank : rowrank 1,prevRank : grade
FROM(SELECT prevRank : NULL, currank : 0, rowrank : 1) r,grades
ORDER BYgrade DESC) g2
ON g1.id g2.id SET g1.rankNum g2.ranking;运行结果如图我们可以看出此时的75已然变成了6实现了跳跃 总结 希望这篇博客对大家有所帮助