iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中多种排名实现
  • 449
分享到

MySQL中多种排名实现

mysql数据库java 2023-09-15 09:09:10 449人浏览 安东尼
摘要

文章目录 一、数据库表结构以及数据二、实现排名(不分组)1、不重复,连续1.1、不同版本实现1)mysql5.7实现2)mysql8实现 1.2、效果 2、并列排名,连续2.1、

文章目录

一、数据库表结构以及数据

CREATE TABLE `forlan_score` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',  `student_name` varchar(255) DEFAULT NULL COMMENT '学生名称',  `score` int(20) DEFAULT '-1' COMMENT '分数',`course_name` varchar(255) DEFAULT NULL COMMENT '课程',  PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='学生成绩表';INSERT INTO `test`.`forlan_score` (`id`, `student_name`, `score`, `course_name`) VALUES (1, '小明', 70, '数学');INSERT INTO `test`.`forlan_score` (`id`, `student_name`, `score`, `course_name`) VALUES (2, '小红', 65, '英语');INSERT INTO `test`.`forlan_score` (`id`, `student_name`, `score`, `course_name`) VALUES (3, '小林', 100, '数学');INSERT INTO `test`.`forlan_score` (`id`, `student_name`, `score`, `course_name`) VALUES (4, '小黄', 100, '语文');INSERT INTO `test`.`forlan_score` (`id`, `student_name`, `score`, `course_name`) VALUES (5, '小东', 80, '语文');INSERT INTO `test`.`forlan_score` (`id`, `student_name`, `score`, `course_name`) VALUES (6, '小美', 90, '英语');INSERT INTO `test`.`forlan_score` (`id`, `student_name`, `score`, `course_name`) VALUES (7, '小伟', 88, '英语');INSERT INTO `test`.`forlan_score` (`id`, `student_name`, `score`, `course_name`) VALUES (8, '小小', 100, '数学');

二、实现排名(不分组)

1、不重复,连续

1.1、不同版本实现

1)Mysql5.7实现

  • 使用自定义变量(外部sql
SET @cur_rank := 0;SELECTstudent_name,score,@cur_rank := @cur_rank + 1 AS ranking FROMforlan_score ORDER BYscore DESC;
  • 使用自定义变量(内部sql)(推荐)
SELECTfs.student_name,fs.score,( @cur_rank := @cur_rank + 1 ) AS ranking FROMforlan_score fs,( SELECT @cur_rank := 0 ) r ORDER BYscore DESC;

2)mysql8实现

ROW_NUMBER()

SELECTstudent_name,score,ROW_NUMBER() OVER ( ORDER BY score DESC ) AS ranking FROMforlan_score;

1.2、效果

+--------------+-------+---------+| student_name | score | ranking |+--------------+-------+---------+| 小林         |   100 |       1 || 小黄         |   100 |       2 || 小小         |   100 |       3 || 小美         |    90 |       4 || 小伟         |    88 |       5 || 小东         |    80 |       6 || 小明         |    70 |       7 || 小红         |    65 |       8 |+--------------+-------+---------+

2、并列排名,连续

2.1、不同版本实现

1)mysql5.7实现

  • 使用自定义变量 + IF
SELECTfs.student_name,fs.score,IF( @pre_score = fs.score, @cur_rank, @cur_rank := @cur_rank + 1 ) AS ranking,@pre_score := fs.score FROMforlan_score fs,( SELECT @cur_rank := 0, @pre_score := NULL ) r ORDER BYfs.score DESC;
  • 使用自定义变量 + CASE WHEN
SELECTfs.student_name,fs.score,(CASEWHEN @pre_score = fs.score THEN @cur_rank WHEN @pre_score := fs.score THEN @cur_rank := @cur_rank + 1 END ) AS ranking FROMforlan_score fs,(SELECT @cur_rank := 0,@pre_score := NULL) r ORDER BYfs.score DESC;

2)mysql8实现

DENSE_RANK()

SELECTstudent_name,score,DENSE_RANK() OVER ( ORDER BY score DESC ) AS ranking FROMforlan_score;

2.2、效果

+--------------+-------+---------+| student_name | score | ranking |+--------------+-------+---------+| 小林         |   100 |       1 || 小黄         |   100 |       1 || 小小         |   100 |       1 || 小美         |    90 |       2 || 小伟         |    88 |       3 || 小东         |    80 |       4 || 小明         |    70 |       5 || 小红         |    65 |       6 |+--------------+-------+---------+

3、并列排名,不连续

3.1、不同版本实现

1)mysql5.7实现

  • 使用自定义变量 + IF
SELECTfs.student_name,fs.score,@row_num := @row_num + 1,IF( @pre_score = fs.score, @cur_rank, @cur_rank := @row_num ) AS ranking,@pre_score := fs.score FROMforlan_score fs,(SELECT @cur_rank := 0,@pre_score := NULL,@row_num := 0 ) r ORDER BYfs.score DESC;
  • 使用自定义变量 + CASE WHEN
SELECTfs.student_name,fs.score,@row_num := @row_num + 1,( CASE WHEN @pre_score = fs.score THEN @cur_rank WHEN @pre_score := fs.score THEN @cur_rank := @row_num END ) AS ranking FROMforlan_score fs,( SELECT @cur_rank := 0, @pre_score := NULL, @row_num := 0 ) r ORDER BYfs.score DESC;

2)mysql8实现

RANK()

SELECTstudent_name,score,RANK() OVER ( ORDER BY score DESC ) AS ranking FROMforlan_score;

3.2、效果

+--------------+-------+---------+| student_name | score | ranking |+--------------+-------+---------+| 小林         |   100 |       1 || 小黄         |   100 |       1 || 小小         |   100 |       1 || 小美         |    90 |       4 || 小伟         |    88 |       5 || 小东         |    80 |       6 || 小明         |    70 |       7 || 小红         |    65 |       8 |+--------------+-------+---------+

三、按照课程分组实现排名

1、不重复,连续

1.1、不同版本实现

1)mysql5.7实现

  • 使用自定义变量 + IF
SELECTfs.student_name,fs.course_name,fs.score,IF(@cur_couse = course_name, @cur_rank := @cur_rank+1, @cur_rank :=1) AS ranking,@cur_couse := fs.course_nameFROMforlan_score fs,( SELECT @cur_rank := 0,  @cur_couse := NULL ) r ORDER BYfs.course_name,fs.score DESC;

2)mysql8实现

ROW_NUMBER()

SELECTstudent_name,course_name,score,ROW_NUMBER() OVER (PARTITioN BY course_name ORDER BY course_name,score DESC) AS rankingFROMforlan_score;

1.2、效果

+--------------+-------------+-------+---------+| student_name | course_name | score | ranking |+--------------+-------------+-------+---------+| 小林         | 数学        |   100 |       1 || 小小         | 数学        |   100 |       2 || 小明         | 数学        |    70 |       3 || 小美         | 英语        |    90 |       1 || 小伟         | 英语        |    88 |       2 || 小红         | 英语        |    65 |       3 || 小黄         | 语文        |   100 |       1 || 小东         | 语文        |    80 |       2 |+--------------+-------------+-------+---------+

2、并列排名,连续

2.1、不同版本实现

1)mysql5.7实现

  • 使用自定义变量 + IF
SELECTfs.student_name,fs.course_name,fs.score,IF(@cur_couse = course_name, IF( @pre_score = fs.score, @cur_rank, @cur_rank := @cur_rank+1 ), @cur_rank :=1) AS ranking,@pre_score := fs.score,@cur_couse := fs.course_nameFROMforlan_score fs,( SELECT @cur_rank := 0, @pre_score := NULL, @cur_couse := NULL ) r ORDER BYfs.course_name,fs.score DESC;

2)mysql8实现

DENSE_RANK()

SELECTstudent_name,course_name,score,DENSE_RANK() OVER (PARTITION BY course_name ORDER BY course_name,score DESC) AS rankingFROMforlan_score;

2.2、效果

+--------------+-------------+-------+---------+| student_name | course_name | score | ranking |+--------------+-------------+-------+---------+| 小林         | 数学        |   100 |       1 || 小小         | 数学        |   100 |       1 || 小明         | 数学        |    70 |       2 || 小美         | 英语        |    90 |       1 || 小伟         | 英语        |    88 |       2 || 小红         | 英语        |    65 |       3 || 小黄         | 语文        |   100 |       1 || 小东         | 语文        |    80 |       2 |+--------------+-------------+-------+---------+

3、并列排名,不连续

3.1、不同版本实现

1)mysql5.7实现

  • 使用自定义变量 + IF
SELECTfs.student_name,fs.course_name,fs.score,IF(@cur_couse = course_name, @row_num := @row_num + 1, @row_num :=1),IF(@cur_couse = course_name, IF( @pre_score = fs.score, @cur_rank, @cur_rank := @row_num ),@cur_rank :=1) AS ranking,@pre_score := fs.score,@cur_couse := fs.course_nameFROMforlan_score fs,( SELECT @cur_rank := 0, @pre_score := NULL, @row_num := 0,@cur_couse := NULL ) r ORDER BYfs.course_name,fs.score DESC;

2)mysql8实现

RANK()

SELECTstudent_name,course_name,score,RANK() OVER (PARTITION BY course_name ORDER BY course_name,score DESC) AS rankingFROMforlan_score;

3.2、效果

+--------------+-------------+-------+---------+| student_name | course_name | score | ranking |+--------------+-------------+-------+---------+| 小林         | 数学        |   100 |       1 || 小小         | 数学        |   100 |       1 || 小明         | 数学        |    70 |       3 || 小美         | 英语        |    90 |       1 || 小伟         | 英语        |    88 |       2 || 小红         | 英语        |    65 |       3 || 小黄         | 语文        |   100 |       1 || 小东         | 语文        |    80 |       2 |+--------------+-------------+-------+---------+

来源地址:https://blog.csdn.net/qq_36433289/article/details/128676858

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中多种排名实现

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

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MySQL中多种排名实现
    文章目录 一、数据库表结构以及数据二、实现排名(不分组)1、不重复,连续1.1、不同版本实现1)mysql5.7实现2)mysql8实现 1.2、效果 2、并列排名,连续2.1、...
    99+
    2023-09-15
    mysql 数据库 java
  • mysql中实现排名的方法
    mysql中实现排名的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!mysql中实现排名的方法:使用demo函数,语法...
    99+
    2024-04-02
  • MySql实现按分数排名
    MySql实现分数排名 1.准备工作 创建一个简单的数据表,分数表,根据分数进行排名,创建数据表的sql如下,并插入几行数据。 CREATE TABLE `t_score` ( `id` int N...
    99+
    2023-09-01
    mysql 数据库 java
  • mysql多重排序怎么实现
    在MySQL中,可以使用ORDER BY子句来实现多重排序。以下是一个示例: SELECT * FROM table_na...
    99+
    2024-04-09
    mysql
  • MYSQL如何实现排名及查询指定用户排名功能
    这篇文章主要介绍了MYSQL如何实现排名及查询指定用户排名功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。表结构:CREATE ...
    99+
    2024-04-02
  • MySQL查询排名的2种方式:变量排名、窗口函数
    如果你想在MySQL查询中进行排名,可以使用以下几种方法: 使用变量进行排名: 以下是一个基于分数对学生进行排名的示例: SET @rank = 0;SELECT @rank := @ran...
    99+
    2023-10-12
    mysql 数据库
  • MySQL窗口函数实现榜单排名
    目录rank()dense_rank()row_number()rank()函数的模拟实现dense_rank()的模拟实现row_number的模拟实现总结相信大家在日常的开发中经常会碰到榜单类的活动需求,通常在榜单中...
    99+
    2023-04-11
    MySQL 榜单排名 MySQL 排名
  • MySQL使用变量如何实现各种排序
    小编给大家分享一下MySQL使用变量如何实现各种排序,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!--下面我演示下MySQL中的排序列的实现 --测试数据 CREATE TABLE tb ( ...
    99+
    2024-04-02
  • MySQL如何使用变量实现各种排序
    这篇文章主要介绍了MySQL如何使用变量实现各种排序,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。核心代码--下面我演示下MySQL中的排序列的...
    99+
    2024-04-02
  • MySQL中怎么实现排序
    这期内容当中小编将会给大家带来有关MySQL中怎么实现排序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在我们执行Mysql的Explain语句的时候,经常会看到这样的一...
    99+
    2024-04-02
  • Mysql教程分组排名实现示例详解
    目录1.数据源2.数据整体排名1)普通排名2)并列排名3)并列排名3.数据分组后组内排名1)分组普通排名2)分组后并列排名3)分组后并列排名4.分组后取各组的前两名1.数据源 2....
    99+
    2024-04-02
  • 怎么用MySQL窗口函数实现榜单排名
    本篇内容主要讲解“怎么用MySQL窗口函数实现榜单排名”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用MySQL窗口函数实现榜单排名”吧!首先,先建一个测试表create tabl...
    99+
    2023-07-06
  • Java中List排序的三种实现方法实例
    目录前言1.使用 Comparable 排序2.使用 Comparator 排序2.1 新建 Comparator 比较器2.2 匿名类比较器3.使用 Stream 流排序总结前言 ...
    99+
    2024-04-02
  • mysql中如何添加排序名
    mysql中为排序添加排序名的方法语法:SELECT (@rownum:= @rownum+1) AS rank FROM (SELECT * FROM (自己的表名)) a,(SELECT @rownum:=0) ...
    99+
    2024-04-02
  • VB.NET中怎么实现按文件名排序
    今天就跟大家聊聊有关VB.NET中怎么实现按文件名排序,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。输入 : a1,a2,a10,a001我们知道,如果按照字符串比较,结果应该是 a...
    99+
    2023-06-17
  • PHP实现两种排课方式
    两种排课方式: 固定每周的固定时间上课(例:共上20节,每周六、周日早上8点-10点上课。假如今天周六凌晨1点,那么排课也需要从今天开始)总共上几个周,每周上课时间比较个性化(例:共...
    99+
    2024-04-02
  • 怎么在Mysql中利用排序获取排名
    这篇文章将为大家详细讲解有关怎么在Mysql中利用排序获取排名,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码如下所示:SELECT @...
    99+
    2024-04-02
  • sql中怎么实现多条件多字段排序
    本篇文章为大家展示了sql中怎么实现多条件多字段排序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。语句:复制代码 代码如下: select * from ...
    99+
    2024-04-02
  • SEO如何实现快速排名
    这篇文章主要为大家展示了“SEO如何实现快速排名”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SEO如何实现快速排名”这篇文章吧。邮箱,可以使用雅虎的替身邮(不知道的百度)跟10分钟邮箱(10m...
    99+
    2023-06-10
  • mysql多条件排序的实现方法是什么
    MySQL中可以使用ORDER BY子句来实现多条件排序。ORDER BY子句可以接受多个排序条件,每个条件可以是升序(ASC)或降...
    99+
    2023-08-25
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作