首页 > 数据库 >MySQL 中使用变量实现排名名次

MySQL 中使用变量实现排名名次

时间:2023-07-16 20:47:17浏览次数:28  
标签:01 obj 变量 05 currank score MySQL 名次 2016

title: MySQL 中使用变量实现排名名次
date: 2023-7-16 19:45:26
tags:

- SQL 高级查询

一. 数据准备:

CREATE TABLE sql_rank (
	id INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	user_id INT ( 11 ) UNSIGNED NOT NULL,
	score TINYINT ( 3 ) UNSIGNED NOT NULL,
	add_time date NOT NULL,
	PRIMARY KEY ( id ) 
) ENGINE = INNODB CHARSET = latin1;

INSERT INTO sql_rank ( user_id, score, add_time )
VALUES
	( 100, 50, '2016-05-01' ),
	( 101, 30, '2016-05-01' ),
	( 102, 20, '2016-05-01' ),
	( 103, 60, '2016-05-01' ),
	( 104, 80, '2016-05-01' ),
	( 105, 50, '2016-05-01' ),
	( 106, 70, '2016-05-01' ),
	( 107, 85, '2016-05-01' ),
	(
		108,
	60,
	'2016-05-01');

二. 不管数据相同与否,排名依次排序(1,2,3,4,5,6,7,...)

思路: 将已经排序好的数据从第一条依次取出来,取一条就自增加一,实现从 1 到最后的一个排名

SELECT
	obj.user_id,
	obj.score,
	@rownum := @rownum + 1 AS rownum 
FROM
	( SELECT user_id, score FROM sql_rank ORDER BY score DESC ) obj,
	( SELECT @rownum := 0 ) r

img

三. 只要数据有相同的排名就一样,排名依次排序(1,2,2,3,3,4,5,...)

思路: 当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加 1

SELECT
	obj.user_id,
	obj.score,
CASE
		WHEN @prerow = obj.score THEN
		@currank 
		WHEN @prerow := obj.score THEN
		@currank := @currank + 1 
		WHEN @prerow = 0 THEN
		@currow := @currank + 1 
	END AS currank 
FROM
	( SELECT user_id, score FROM sql_rank ORDER BY score DESC ) obj,
	( SELECT @currank := 0, @prerow := NULL ) r

让我们逐行解释:

  1. WHEN @prerow = obj.score THEN @currank: 这行代码检查前一行的分数是否与当前行的分数相同。如果相同,则将当前的排名(@currank)赋值给当前行的排名。
  2. WHEN @prerow := obj.score THEN @currank := @currank + 1: 这行代码首先将当前行的分数赋值给@prerow变量,然后将当前排名(@currank)加1。
  3. WHEN @prerow = 0 THEN @currow := @currank + 1: 这行代码检查前一行的分数是否为0。如果是,则将当前排名(@currank)加1,并将结果赋值给@currow变量。
  4. END AS currank: 这行代码将计算得到的排名赋值给一个名为currank的列。

img

标签:01,obj,变量,05,currank,score,MySQL,名次,2016
From: https://www.cnblogs.com/BNTang/p/17558482.html

相关文章

  • Mysql进阶篇(二)之索引
    一.索引概述1.介绍索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。2.演示表结构及其数据如下:假如我们要执......
  • Mysql进阶篇(二)之索引
    一.索引概述1.介绍索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。2.演示表结构及其数据如下:假如我们要执行的SQL语......
  • r2dbc mysql
    R2DBCMySQL:异步响应式数据库访问的新时代在传统的JDBC(JavaDatabaseConnectivity)中,数据库访问通常是同步的,这意味着当你执行一个查询或更新时,你必须等待数据库返回结果,然后再进行下一步操作。然而,随着异步编程的兴起,开发者对于更高效的数据库访问方式有了更高的期望。在这篇文章......
  • 安装mysql在线版本
    1. 安装MySQL服务器和客户端:sudoaptinstallmysql-servermysql-client 2.启动sudosystemctlstartmysql 3.修改密码sudomysql_secure_installation输入MySQLroot用户的密码:如果你已经设置了root用户密码,请输入密码并按下Enter键。如果是首次安装,直接......
  • Docker中运行mysql并且数据目录存在本地
    Docker中运行mysql并且数据目录存在本地  Docker中运行mysql并且数据目录存在本地按https://github.com/NeuCharFramework/NCF/wiki/来弄win11,dockerv24.0.2,镜像加速配置: {"debug":false,"experimental":false,"features":{"buildkit":tr......
  • shell查询mysql数据库返回结果
    Shell查询MySQL数据库返回结果作为一名经验丰富的开发者,我将教会你如何通过Shell查询MySQL数据库并返回结果。下面是整个过程的流程图:步骤描述步骤1连接到MySQL数据库步骤2编写SQL查询语句步骤3执行SQL查询语句步骤4处理查询结果步骤5关闭数据库连接......
  • service mysql start 日志 无内容
    实现“servicemysqlstart日志无内容”流程1.确认环境在开始之前,首先需要确认以下几点:确保已经安装了MySQL数据库,并且已经配置好环境变量。确保已经安装了系统服务管理工具(如Systemd)。2.编写脚本文件我们可以通过编写一个简单的脚本文件来实现“servicemysqlstar......
  • mysql 同步至es logstash 每隔10秒执行一次增量同步
      .在Logstash的config目录下创建mysql-es.conf配置文件,Logstash会根据该配置文件从MySQL中读取数据并同步到ES库中。 input{jdbc{jdbc_connection_string=>"jdbc:mysql://localhost:3306/p2p_transaction_0?useUnicode=true&characterEncoding=utf-8&useSSL=fals......
  • linux MySQL数据库索引
    索引在数据库中占有重要地位,当高并发时,一条一条的查找数据是很慢的,但是索引可以分流,可以快速定位,解决高并发。目录一、索引概念二、索引作用三、索引的应用四、索引分类五、索引的创建六、索引的管理七、总结    一、索引概念1.索引概念数据库索......
  • 考勤打卡mysql表
    如何实现考勤打卡MySQL表1.整体流程为了实现考勤打卡功能,我们需要创建一个MySQL表来存储每个员工的打卡记录。下面是整个过程的步骤概述:步骤描述1.创建数据库和表首先创建一个数据库,并在该数据库中创建一个表来存储员工的打卡记录。2.连接数据库使用代码连......