如何快速实现一个榜单排名的需求

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 可以看到使用rank()函数的时候相同的点赞数会返回相同的排名,排名会产生跳跃,最终的排名不是连续的dense_rank()

首先,先建一个测试表
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 p1
left join praise_record p2 on p1.praise_num < p2.praise_num
group by p1.name, p1.praise_num

order 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 p1
left join praise_record p2 on p1.praise_num < p2.praise_num
group by p1.name, p1.praise_num

order 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,这样子就可以得到我们想要的序号
总结
1.rank()函数返回的排名会产生跳跃
2.dense_rank()函数返回的排名是连续的
3.row_number()函数返回的排名类似序号
4.窗口函数是MySQL8.0新增的特性,如果在低版本的MySQL要自己模拟实现一下

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
传感器 JSON 算法
Nuscenes 榜单处理
description 英文翻译中文 根据年份、传感器模态过滤 待续。。。 日期 2024/03/19:根据 NDS、mAP、Date 排序 2024/03/14:文章撰写日期
54 2
|
数据采集 搜索推荐 安全
谷歌新网站多久能有排名?
答案是:谷歌新网站最快7天就能有排名。 新网站的“沙盒”现象 谷歌在对新网站进行排名时,通常会存在一个所谓的“沙盒”阶段,这是一段时间内,新网站似乎在搜索结果中被“固定”或“受限”。 沙盒现象的定义 “沙盒”现象是指新网站在初次发布后的一段时间内,尽管进行了有效的Google优化,但在搜索结果中的排名仍然不如预期。
173 0
谷歌新网站多久能有排名?
|
数据采集 监控 算法
谷歌排名上去之后能维持多久?
答案是:谷歌优化是长周期工作,排名是否稳定取决于您的对手是否继续投入更多资源去运营。 谷歌的搜索排名是由其复杂的算法决定的,这个算法考虑了数以千计的因素。 因此,一旦你的网站在谷歌的搜索排名上升,能否保持这个位置将取决于许多因素。 搜索引擎优化的持久性 持续的优化策略 在你的网站排名上升之后,需要继续执行优化策略以维持排名。 这可能包括定期更新网站内容,保持社交媒体活动,继续建立高质量的外部链接等。
91 0
谷歌排名上去之后能维持多久?
|
数据采集 搜索推荐 安全
2023谷歌排名优化推广指南
答案是:可以做谷歌SEO排名或者谷歌Ads广告来获取关键词流量。 Google优化的重要性 Google优化是确保您的网站在Google搜索引擎中排名靠前的关键过程。 对于任何寻求在线可见性和增长的企业或个人来说,这一过程都至关重要。
101 0
2023谷歌排名优化推广指南
|
数据采集 算法 搜索推荐
如何提升谷歌SEO排名?
答案是:持续建设谷歌GPB外链+优质内容可提升谷歌排名。 内容概述 优化谷歌SEO排名需要深入理解和运用各种优化策略,包括关键词优化、高质量内容、合理的链接策略、技术SEO等,以提升网站的在线可见性。 此外,还需要了解影响SEO排名的各种因素,包括谷歌的排名算法、用户行为等。
144 0
如何提升谷歌SEO排名?
|
SEO
谷歌seo排名不上去怎么办?谷歌排名做不起来怎么办?
第一个场景:网站有持续更新优质的原创内容,但是没有做英文外链,导致谷歌排名一直上不去,该怎么办?
211 0
谷歌seo排名不上去怎么办?谷歌排名做不起来怎么办?
|
算法 SEO
谷歌优化排名怎么做出来的?谷歌排名多久做上去?
如果你只是为了抄袭,搬运同行文章,说实话你没有谷歌排名和流量是对的,因为你不配拥有。
181 0
谷歌优化排名怎么做出来的?谷歌排名多久做上去?
|
算法 搜索推荐 机器人
Google关键词排名多久做上去?谷歌新网站多久能有排名?
关于优质英文外链建设方面,其实我们知道你们是有想法的,知道要做英文外链,可不知道怎么做,做多少量
306 0
Google关键词排名多久做上去?谷歌新网站多久能有排名?
|
SEO
谷歌seo新站如何快速排名?如何提高Google自然排名
因为结果真的不会陪你演戏,有价值的外链,肯定不能是那种自己注册一下,然后可以发布的那种。
233 0
谷歌seo新站如何快速排名?如何提高Google自然排名
|
数据采集 缓存 搜索推荐
如何提高谷歌排名?
作为一名新手,你可能在思考如何提高谷歌排名。 实际上,优化谷歌排名的方法有很多,只要掌握一些基本原则和技巧,你就能在谷歌搜索引擎中获得理想的排名。 下面是一些建议,可以帮助你快速提高谷歌排名。
122 0