当前位置: 首页 > news >正文

Mysql实现对某一字段排序并将排名写入另一字段

文章目录

  • 前言
  • 一、数据库表结构和样例数据
  • 二、排名操作
    • 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`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;
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.无间隔排名

无间隔排名就是指当存在相同数据时,我们希望它们的排名是一样的,就比如2,2,3这组数据,最终的排名效果是1,1,2;其中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.有间隔排名

这个排名规则是我业务上真正需要的,所谓的有间隔就是比如之前的例子2,2,3,那么最后的排名结果是1,1,3;这里的数据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,实现了跳跃:
在这里插入图片描述


总结

  希望这篇博客对大家有所帮助!!!

http://www.lryc.cn/news/68380.html

相关文章:

  • vector容器 [上]
  • React Native技术探究:开发高质量的跨平台移动应用的秘诀
  • C语言函数大全-- w 开头的函数(2)
  • kafka启动创建topic报错:zookeeper is not a recognized option
  • 11个超好用的SVG编辑工具
  • 低代码平台:10分钟从入门到原理
  • 【JavaScript】如何获取客户端IP地址?
  • 数据科学中使用的17 种相似性和相异性度量之欧氏距离
  • 朋友去华为面试,轻松拿到30K的Offer,羡慕了......
  • MySQL入门第五课:数据更新
  • ALSA子系统(十八)------指纹解锁动画提示声卡顿问题解析
  • [230513] TPO72 | 2022年托福阅读真题第1/36篇 | 10:45
  • 操作符详解
  • 【MATLAB图像处理实用案例详解(16)】——利用概念神经网络实现手写体数字识别
  • 数据库管理-第六十九期 另一种累(20230422)
  • Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)
  • Redis系列--redis持久化
  • 在外Windows远程连接MongoDB数据库【无公网IP】
  • 学网络安全怎么挖漏洞?怎么渗透?
  • KL散度和交叉熵的对比介绍
  • 浪涌保护器:保护电子设备免受雷击侵害
  • js绘制的红心
  • 十、Feign客户端
  • 登录appuploader
  • 都别吹牛逼了,2个英语指令简单评测便知ChatGPT、博弈Ai、文心一言、通义千问、讯飞星火真实水平
  • 使用Spring Boot快速搭建项目:减少配置,提升开发效率
  • (2)数码管
  • 赫夫曼树和赫夫曼编码详解
  • unity UGUI系统梳理 -交互组件
  • HTTP第15讲——HTTP的连接管理