我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么用MySQL窗口函数实现榜单排名

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么用MySQL窗口函数实现榜单排名

本篇内容主要讲解“怎么用MySQL窗口函数实现榜单排名”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用MySQL窗口函数实现榜单排名”吧!

首先,先建一个测试表

create table praise_record(    id bigint primary key auto_increment,    name varchar(10),    praise_num int) ENGINE=InnoDB;

然后让chatGpt给我们生成几条测试数据

INSERT INTO praise_record (name, praise_num) VALUES ('John', 5);INSERT INTO praise_record (name, praise_num) VALUES ('Jane', 3);INSERT INTO praise_record (name, praise_num) VALUES ('Bob', 10);INSERT INTO praise_record (name, praise_num) VALUES ('Alice', 3);INSERT INTO praise_record (name, praise_num) VALUES ('David', 7);INSERT INTO praise_record (name, praise_num) VALUES ('oct', 7);

然后就可以开始实现我们的需求:返回点赞的榜单,并返回排名

rank()

使用rank()函数返回点赞的榜单, rank() over()

## 注意这里返回的rank字段要用反引号包起来select name, praise_num, rank() over (order by praise_num desc) as `rank` from praise_record;+-------+------------+------+| name  | praise_num | rank |+-------+------------+------+| Bob   |         10 |    1 || David |          7 |    2 || oct   |          7 |    2 || John  |          5 |    4 || Jane  |          3 |    5 || Alice |          3 |    5 |+-------+------------+------+

可以看到使用rank()函数的时候相同的点赞数会返回相同的排名,排名会产生跳跃,最终的排名不是连续的

dense_rank()

使用dense_rank()函数返回点赞的榜单, dense_rank() over()

 select name, praise_num, dense_rank() over (order by praise_num desc) as `rank` from praise_record;  +-------+------------+------+| name  | praise_num | rank |+-------+------------+------+| Bob   |         10 |    1 || David |          7 |    2 || oct   |          7 |    2 || John  |          5 |    3 || Jane  |          3 |    4 || Alice |          3 |    4 |+-------+------------+------+

与rank()函数相同的是,相同点赞数会返回相同的排名,但是dense_rank()返回的最终排名是连续的排名

row_number()

row_number()函数返回点赞的榜单,row_number() over()

 select name, praise_num, row_number() over (order by praise_num desc) as `rank` from praise_record; +-------+------------+------+| name  | praise_num | rank |+-------+------------+------+| Bob   |         10 |    1 || David |          7 |    2 || oct   |          7 |    3 || John  |          5 |    4 || Jane  |          3 |    5 || Alice |          3 |    6 |+-------+------------+------+

row_number()函数适合当返回的列表只需要序号时使用

以上三个函数都是MySQL8.0新加入的,所以在MySQL5.7这些老版本上我们可以模拟实现一下,顺便学习一下这三个窗口函数的实现原理

rank()函数的模拟实现

select p1.name, p1.praise_num, count(p2.praise_num) + 1 as `rank` from praise_record p1left join praise_record p2 on p1.praise_num < p2.praise_numgroup by p1.name, p1.praise_numorder by `rank`;+-------+------------+------+| name  | praise_num | rank |+-------+------------+------+| Bob   |         10 |    1 || David |          7 |    2 || oct   |          7 |    2 || John  |          5 |    4 || Jane  |          3 |    5 || Alice |          3 |    5 |+-------+------------+------+

我们可以使用自联接的方式将每个分数低于当前行分数的记录计数,最后将计数值加1作为当前行的排名,来模拟实现rank()

dense_rank()的模拟实现

select p1.name, p1.praise_num, count(distinct p2.praise_num) + 1 as `dense_rank` from praise_record p1left join praise_record p2 on p1.praise_num < p2.praise_numgroup by p1.name, p1.praise_numorder by `dense_rank`;+-------+------------+------------+| name  | praise_num | dense_rank |+-------+------------+------------+| Bob   |         10 |          1 || oct   |          7 |          2 || David |          7 |          2 || John  |          5 |          3 || Jane  |          3 |          4 || Alice |          3 |          4 |+-------+------------+------------+

dense_rank的实现与rank差不多,唯一的区别是增加了distinct对点赞数做了去重,这样子对不同的点赞数返回的排名就是连续的

row_number的模拟实现

##使用自定义变量得先初始化set @rowNum = 0;select name, praise_num, @rowNum := @rowNum +1 as `row_number`  from praise_record order by praise_num desc ;+-------+------------+------------+| name  | praise_num | row_number |+-------+------------+------------+| Bob   |         10 |          1 || David |          7 |          2 || oct   |          7 |          3 || John  |          5 |          4 || Jane  |          3 |          5 || Alice |          3 |          6 |+-------+------------+------------+

我们可以使用一个rowNum变量来记录行号,每一行的数据rowNUm都+1,这样子就可以得到我们想要的序号

到此,相信大家对“怎么用MySQL窗口函数实现榜单排名”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么用MySQL窗口函数实现榜单排名

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么用MySQL窗口函数实现榜单排名

本篇内容主要讲解“怎么用MySQL窗口函数实现榜单排名”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用MySQL窗口函数实现榜单排名”吧!首先,先建一个测试表create table pra
2023-07-06

MySQL窗口函数实现榜单排名

目录rank()dense_rank()row_number()rank()函数的模拟实现dense_rank()的模拟实现row_number的模拟实现总结相信大家在日常的开发中经常会碰到榜单类的活动需求,通常在榜单中都会要求返回排名,今
2023-04-11

如何使用Pandas实现MySQL窗口函数

今天小编给大家分享一下如何使用Pandas实现MySQL窗口函数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前言环境:
2023-07-05

使用Pandas实现MySQL窗口函数的解决方法

本文主要介绍MySQL中的窗口函数row_number()、lead()/lag()、rank()/dense_rank()、first_value()、count()、sum()如何使用pandas实现,同时二者又有什么区别,感兴趣的朋友一起看看吧
2023-02-22

怎么使用QGraphicsView实现气泡聊天窗口+排雷功能

这篇“怎么使用QGraphicsView实现气泡聊天窗口+排雷功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用QG
2023-06-30

C#中怎么利用排序函数实现冒泡排序

今天就跟大家聊聊有关C#中怎么利用排序函数实现冒泡排序,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。所谓冒泡排序就是在每一次排序的过程中总有一个***的值被移动到后面,值小的就像水泡
2023-06-17

PHP中怎么利用sort()函数实现数组排序

PHP中怎么利用sort()函数实现数组排序,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一般数组中的各元素均以字符或数字表现的,所以可对数组元素进行升序排列,
2023-06-17

Java怎么模拟rank/over函数实现获取分组排名

这篇“Java怎么模拟rank/over函数实现获取分组排名”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java怎么模拟r
2023-07-06

PHP中怎么利用strrev()函数实现逆序排列

这期内容当中小编将会给大家带来有关PHP中怎么利用strrev()函数实现逆序排列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、二分法/** * 二分法实现字符串逆序排列 * @param str
2023-06-17

怎么使用Pandas实现MySQL日期函数

本文小编为大家详细介绍“怎么使用Pandas实现MySQL日期函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Pandas实现MySQL日期函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、前言环
2023-07-05

PHP中怎么利用usort()函数实现自定义排序

PHP中怎么利用usort()函数实现自定义排序,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。PHP函数usort()的一个例子,在这个例子中根据它们的长度对数组元素进行排序,
2023-06-17

Java8中怎么利用Stream实现函数式接口

这期内容当中小编将会给大家带来有关Java8中怎么利用Stream实现函数式接口,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。函数式接口什么是函数式接口?简单来说就是只有一个抽象函数的接口。为了使得函数式
2023-06-16

怎么用sort()函数与文件碎片实现表格的前端排序

本篇内容介绍了“怎么用sort()函数与文件碎片实现表格的前端排序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!表格排序在网页的利用也很多,
2023-06-27

编程热搜

目录