返回顶部
首页 > 资讯 > 数据库 >总结几种MySQL中常见的排名问题
  • 181
分享到

总结几种MySQL中常见的排名问题

MySQL统计排名MySQL排名 2022-05-16 03:05:02 181人浏览 泡泡鱼
摘要

前言: 在某些应用场景中,我们经常会遇到一些排名的问题,比如按成绩或年龄排名。排名也有多种排名方式,如直接排名、分组排名,排名有间隔或排名无间隔等等,这篇文章将总结几种Mysql中常见的排名问题。 创建测试表

前言:

在某些应用场景中,我们经常会遇到一些排名的问题,比如按成绩或年龄排名。排名也有多种排名方式,如直接排名、分组排名,排名有间隔或排名无间隔等等,这篇文章将总结几种Mysql中常见的排名问题。

创建测试表


create table scores_tb (
 id int auto_increment primary key,
 xuehao int not null, 
 score int not null
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into scores_tb (xuehao,score) values (1001,89),(1002,99),(1003,96),(1004,96),(1005,92),(1006,90),(1007,90),(1008,94);

# 查看下插入的数据
mysql> select * from scores_tb;
+----+--------+-------+
| id | xuehao | score |
+----+--------+-------+
| 1 | 1001 | 89 |
| 2 | 1002 | 99 |
| 3 | 1003 | 96 |
| 4 | 1004 | 96 |
| 5 | 1005 | 92 |
| 6 | 1006 | 90 |
| 7 | 1007 | 90 |
| 8 | 1008 | 94 |
+----+--------+-------+

1.普通排名

按分数高低直接排名,从1开始,往下排,类似于row number。下面我们给出查询语句及排名结果。


# 查询语句
SELECT xuehao, score, @curRank := @curRank + 1 AS rank
FROM scores_tb, (
SELECT @curRank := 0
) r
ORDER BY score desc;

# 排序结果
+--------+-------+------+
| xuehao | score | rank |
+--------+-------+------+
| 1002 | 99 | 1 |
| 1003 | 96 | 2 |
| 1004 | 96 | 3 |
| 1008 | 94 | 4 |
| 1005 | 92 | 5 |
| 1006 | 90 | 6 |
| 1007 | 90 | 7 |
| 1001 | 89 | 8 |
+--------+-------+------+

上述查询语句中,我们申明了一个变量 @curRank ,并将此变量初始化为0,查得一行将此变量加一,并以此作为排名。我们看到这类排名是没间隔的并且有些分数相同但排名不同。

2.分数相同,名次相同,排名无间隔


# 查询语句
SELECT xuehao, score, 
CASE
WHEN @prevRank = score THEN @curRank
WHEN @prevRank := score THEN @curRank := @curRank + 1
END AS rank
FROM scores_tb, 
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY score desc;

# 排名结果
+--------+-------+------+
| xuehao | score | rank |
+--------+-------+------+
| 1002 | 99 | 1 |
| 1003 | 96 | 2 |
| 1004 | 96 | 2 |
| 1008 | 94 | 3 |
| 1005 | 92 | 4 |
| 1006 | 90 | 5 |
| 1007 | 90 | 5 |
| 1001 | 89 | 6 |
+--------+-------+------+

3.并列排名,排名有间隔

另外一种排名方式是相同的值排名相同,相同值的下一个名次应该是跳跃整数值,即排名有间隔。


# 查询语句
SELECT xuehao, score, rank FROM
(SELECT xuehao, score,
@curRank := IF(@prevRank = score, @curRank, @incRank) AS rank, 
@incRank := @incRank + 1, 
@prevRank := score
FROM scores_tb, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
) r
ORDER BY score desc) s;
# 排名结果
+--------+-------+------+
| xuehao | score | rank |
+--------+-------+------+
| 1002 | 99 | 1 |
| 1003 | 96 | 2 |
| 1004 | 96 | 2 |
| 1008 | 94 | 4 |
| 1005 | 92 | 5 |
| 1006 | 90 | 6 |
| 1007 | 90 | 6 |
| 1001 | 89 | 8 |
+--------+-------+------+

上面介绍了三种排名方式,实现起来还是比较复杂的。好在Mysql8.0增加了窗口函数,使用内置函数可以轻松实现上述排名。

MySQL8.0 利用窗口函数实现排名

MySQL8.0中可以利用 ROW_NUMBER(),DENSE_RANK(),RANK() 三个窗口函数实现上述三种排名,需要注意的一点是as后的别名,千万不要与前面的函数名重名,否则会报错,下面给出这三种函数实现排名的案例:


# 三条语句对于上面三种排名
select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb;
select xuehao,score, DENSE_RANK() OVER(order by score desc) as dense_r from scores_tb;
select xuehao,score, RANK() over(order by score desc) as r from scores_tb;

# 一条语句也可以查询出不同排名
SELECT xuehao,score,
 ROW_NUMBER() OVER w AS 'row_r',
 DENSE_RANK() OVER w AS 'dense_r',
 RANK()  OVER w AS 'r'
FROM `scores_tb`
WINDOW w AS (ORDER BY `score` desc);

# 排名结果
+--------+-------+-------+---------+---+
| xuehao | score | row_r | dense_r | r |
+--------+-------+-------+---------+---+
| 1002 | 99 |  1 |  1 | 1 |
| 1003 | 96 |  2 |  2 | 2 |
| 1004 | 96 |  3 |  2 | 2 |
| 1008 | 94 |  4 |  3 | 4 |
| 1005 | 92 |  5 |  4 | 5 |
| 1006 | 90 |  6 |  5 | 6 |
| 1007 | 90 |  7 |  5 | 6 |
| 1001 | 89 |  8 |  6 | 8 |
+--------+-------+-------+---------+---+

总结:

本文给出三种不同场景下实现统计排名的SQL,可以根据不同业务需求选取合适的排名方案。对比MySQL8.0,发现利用窗口函数可以更轻松实现排名,其实业务需求远远比我们举的示例要复杂许多,用SQL实现此类业务需求还是需要慢慢积累的。

以上就是总结几种MySQL中常见的排名问题的详细内容,更多关于MySQL 排名的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 总结几种MySQL中常见的排名问题

本文链接: https://lsjlt.com/news/9778.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 总结几种MySQL中常见的排名问题
    前言: 在某些应用场景中,我们经常会遇到一些排名的问题,比如按成绩或年龄排名。排名也有多种排名方式,如直接排名、分组排名,排名有间隔或排名无间隔等等,这篇文章将总结几种MySQL中常见的排名问题。 创建测试表 ...
    99+
    2022-05-16
    MySQL 统计排名 MySQL 排名
  • java中几种常见的排序算法总结
    目录本节目标;【插入排序】【优化版】【希尔排序】【选择排序】【堆排序】 【冒泡排序】介绍一个冒泡排序的优化方法; 【快速排序】【归并排序】【正文】【代码简介;】&...
    99+
    2024-04-02
  • MySQL无法启动几种常见问题小结
    昨天在群里看到有新同学还在问MySQL无法启动的问题,于是总结了几个常见情况,权当普及帖了,老鸟自觉飞过。 问题1:目录、文件权限设置不正确 MySQL的$datadir目录,及其下...
    99+
    2022-11-15
    MySQL无法启动
  • MySQL中常见的几种日志汇总
    前言: 在 MySQL 系统中,有着诸多不同类型的日志。各种日志都有着自己的用途,通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数据。这些不同类型的日志有助于我们更清晰的了解数据库,在日常学习及运维过程...
    99+
    2022-05-11
    mysql常见日志 mysql常见日志有哪些 mysql 日志
  • 常见的几种排序
    快速排序      从数列中挑出一个元素,称为 “基准”(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面...
    99+
    2024-04-02
  • Android中ListView的几种常见的优化方法总结
    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Li...
    99+
    2022-06-06
    方法 listview 优化 Android
  • Android切圆角的几种常见方式总结
    Android 中有哪些可以切圆角的实现方式呢? 本文总结一下常用的方式。 以下内容分为以下几部分: 利用 Drawable 的 shape xml 实现 CardV...
    99+
    2022-06-06
    Android
  • Java中常见的编码集问题总结
    目录一、遇到一个问题1、读取CSV文件2、控制台输出二、带有BOM的UTF-81、BOM2、UTF-83、UTF-8 BOM4、CSV文件乱码问题三、编码解码四、解决读取&ldquo...
    99+
    2023-02-16
    Java常见编码集问题 Java编码集问题 Java编码集
  • Android开发常见问题总结
    本文总结分析了Android开发常见问题。分享给大家供大家参考,具体如下: 1. 在ui中使用scrollview之后,假如复写activity的onkeydown或onkey...
    99+
    2022-06-06
    android开发 Android
  • MySQL中几种常见的日志
    前言: 在 MySQL 系统中,有着诸多不同类型的日志。各种日志都有着自己的用途,通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数据。这些不同类型的日志有助于我们更清晰的了解数据库,在日常学习及运维过程中也会和这些日志打交道。...
    99+
    2015-01-20
    MySQL中几种常见的日志 数据库入门 数据库基础教程 数据库 mysql
  • Mysql中常用的几种join连接方式总结
    目录1.内连接2.左连接3.右连接4.查询左表独有数据5.查询右表独有数据6.全连接7.查询左右表各自的独有的数据总结1.首先准备两张表 部门表: 员工表: 以下我们就对这两张表...
    99+
    2024-04-02
  • Python基础常见问题总结(一)
    1.__ foo 、foo_ 和 __foo__ 三者之间的区别是什么?__foo表示私有属性、_foo表示受保护的属性、__foo__表示Python自带的属性 2.请您简述Python编译的工作原理,PyCodeObject 和 Py...
    99+
    2023-01-31
    常见问题 基础 Python
  • R语言中常见的几种创建矩阵形式总结
    矩阵概述 R语言的实质实质上是与matlab差不多的,都是以矩阵为基础的 在R语言中,矩阵(matrix)是将数据按行和列组织数据的一种数据对象,相当于二维数组,可以用于描述二维的数...
    99+
    2024-04-02
  • jquery实现Ajax请求的几种常见方式总结
    在jQuery中,可以使用以下几种方式实现Ajax请求:1. 使用$.ajax()方法:这是最常见和最灵活的方式。可以通过设置不同的...
    99+
    2023-08-14
    JQuery
  • Redis中一些最常见的面试问题总结
    前言 经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估计是我...
    99+
    2024-04-02
  • Mysql索引常见问题汇总
    Q1:数据库有哪些索引?优缺点是什么? B树索引:大多数数据库采用的索引(innoDB采用的是b+树)。能够加快访问数据的速度,尤其是范围数据的查找非常快。缺点是只能从索引的最左列开始查找,也不能跳过索引中的列,如果...
    99+
    2022-05-17
    MySQL 索引 MySQL 索引问题
  • mysql复制表的几种常用方式总结
    目录mysql复制表的几种方式 1、复制表结构及数据到新表2、只复制表结构到新表3、复制旧表的数据到新表(假设两个表结构一样)4、复制旧表的数据到新表(假设两个表结构不一样)5、可以将表1结构复制到表26、可以...
    99+
    2023-04-10
    mysql复制表语句 mysql如何复制表 mysql数据表复制
  • 详细总结Python常见的安全问题
    目录一、输入注入二、assert 语句(Assert statements)三、计时攻击(Timing attacks)四、临时文件(Temporary files)五、使用 yam...
    99+
    2024-04-02
  • python链接mysql常见问题汇总
    Python与Mysql一、安装MySQLdb模块使用python连接Mysql的前提,就是需要一个让python连接到Mysql的接口,这就是MySQLdb模块。验证是否已经安装了MySQLdb:=====================...
    99+
    2023-01-31
    常见问题 链接 python
  • 详谈spring boot中几种常见的依赖注入问题
    目录@Autowired依赖注入问题–逻辑使用先于@Autowired注解处理测试用例BeanFactory.getBean问题–getBean调用先于BeanDefinition信...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作