MySQL实现排名

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: MySQL实现排名

排名在我们日常生活中并不陌生,例如玩游戏的分数等等排名,都需要用到SQL语句查询数据库。不过具体怎么通过SQL语句实现排名呢?

为了举例说明,我先随便定义一个表和一些数据,以便于下面的查询:

createtable `playertable` (  `id` bigintnotnull,  `nickname` varchar(32)notnull,  `age` intnotnull,  `score` intnotnull,  primary key (`id`)) engine=InnoDB default charset=utf8mb4;insertinto `playertable`
(id, nickname, age, score)values(1,"test",17,192),(2,"dev",11,12),(3,"asa",27,34),(4,"err",34,112),(5,"admin",11,2233),(6,"lkkka",23,432),(7,"pop",71,675),(8,"asddw",33,23),(9,"root",24,908),(10,"qwe",12,233),(11,"zxc",23,452),(12,"jkalso",45,123),(13,"plomo",23,231),(14,"llkknsadsa",7,659);

1,基本知识

在这个教程中需要涉及到一点基本的知识先在此带一下。

(1) as语句

用于定义别名。表和变量都可以定义别名。其中表定义别名时可以省略as,例如:

(select*from playertable)as t;(select*from playertable) t;

都是把查询得到的结果定义为了t

(2) 派生表

我们每做一次的select的操作得到的结果都可以作为一个临时的派生表,我们甚至还可以在这个派生表里面进行进一步查询进行数据筛选。例如我从上述玩家表中年龄从小到大的前十名中进一步筛选出分数从高到低的前五名的昵称、年龄、分数信息:

select nickname, age, score from(select*from `playertable` orderby age limit10)as temp orderby score desclimit5;

结果:

网络异常,图片无法展示
|

我们可以先看括号部分,意思是先选择玩家表中的年龄从小到大的前十个作为派生表,并给其别名为temp。这样派生表就定义出来了。一般括号会被优先执行,可以将其当做一个整体。

再进一步筛选就是括号外大部分语句了!注意派生表必须要有别名!

具体分解可以看图:

网络异常,图片无法展示
|

(3) MySQL中的@符号

可以自定义一个临时变量。通过以下语句设定临时变量:

set @变量名 := 变量值;-- 或者(select @变量名 := 变量值)as temp;

2,具体实现

基本思路就是,定义一个名为row的变量用于表示当前排名,再定义两个临时派生表,一个派生表主要是用于row变量的初始化,且这个表只有一个字段,那就是row,且每一条记录row的值就会加一,另一个派生表就是我们查询玩家数据并排序得到的结果。最后将这两个派生表组合起来不就行了吗?

例如选择分数前五名玩家并排名:

select nickname, score, @row := @row +1as sequence from(select @row :=0)as ranktable,(select*from `playertable` orderby score desclimit5)as playerinfo;

结果:

网络异常,图片无法展示
|

语句分解如下:

网络异常,图片无法展示
|

加上where语句还可以查询具体玩家的名次:

select nickname, score, @row := @row +1as sequence from(select @row :=0)as ranktable,(select*from `playertable` orderby score desclimit5)as playerinfo where nickname="admin";

结果:

网络异常,图片无法展示
|

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
关系型数据库 MySQL
|
关系型数据库 MySQL
Mysql 常见排名实现
Mysql 常见排名实现
244 0
|
SQL 关系型数据库 MySQL
MySQL实现简单排名
MySQL实现简单排名
132 0
|
SQL JSON NoSQL
一起来聊聊MySQL 8.0 的特性及排名可好?
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
一起来聊聊MySQL 8.0 的特性及排名可好?
|
SQL 关系型数据库 MySQL
一文解决所有MySQL分类排名问题
对数据库中的记录依据某个字段进行排序是一种常见需求,虽然简单的Order by可以胜任,但如果想要输出具体的排名却难以直接实现。如果再考虑重复排名或者分类排名,那么情况就更为复杂。 本文介绍4种分类排名方式:子查询、自连接、自定义变量以及MySQL8.0窗口函数。
711 0
一文解决所有MySQL分类排名问题
|
关系型数据库 MySQL
MYSQL实现排名函数RANK,DENSE_RANK和ROW_NUMBER
本文介绍了MYSQL实现排名函数RANK,DENSE_RANK和ROW_NUMBER
350 0
|
关系型数据库 MySQL 计算机视觉
|
关系型数据库 MySQL

推荐镜像

更多