MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名。尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名效果。

在这里我用一个简单例子来实现排名的查询:

首先我们先创建一个我们需要进行高级排名查询的players表,

CREATE 

INSERT INTO `players` (`pid`, `name`, `age`) VALUES
(1, 'Samual', 25),
(2, 'Vino', 20),
(3, 'John', 20),
(4, 'Andy', 22),
(5, 'Brian', 21),
(6, 'Dew', 24),
(7, 'Kris', 25),
(8, 'William', 26),
(9, 'George', 23),
(10, 'Peter', 19),
(11, 'Tom', 20),
(12, 'Andre', 20);

1、在MySQL中实现Rank普通排名函数

在这里,我们希望获得一个排名字段的列,以及age的升序排列。所以我们的查询语句将是:

SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age
| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    3 |
|   3 |    John |  20 |    4 |
|  11 |     Tom |  20 |    5 |
|   5 |   Brian |  21 |    6 |
|   4 |    Andy |  22 |    7 |
|   9 |  George |  23 |    8 |
|   6 |     Dew |  24 |    9 |
|   7 |    Kris |  25 |   10 |
|   1 |  Samual |  25 |   11 |
|   8 | William |  26 |   12 |

要在mysql中声明一个变量,你必须在变量名之前使用@符号。FROM子句中的(@curRank := 0)部分允许我们进行变量初始化,而不需要单独的SET命令。当然,也可以使用SET,但它会处理两个查询:

SET @curRank := 0;
SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players
ORDER BY age

2、查询以降序排列

首要按age的降序排列,其次按name进行排列,只需修改查询语句加上ORDER BY和 DESC以及列名即可。

SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age DESC, name
| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|   8 | William |  26 |    1 |
|   7 |    Kris |  25 |    2 |
|   1 |  Samual |  25 |    3 |
|   6 |     Dew |  24 |    4 |
|   9 |  George |  23 |    5 |
|   4 |    Andy |  22 |    6 |
|   5 |   Brian |  21 |    7 |
|  12 |   Andre |  20 |    8 |
|   3 |    John |  20 |    9 |
|  11 |     Tom |  20 |   10 |
|   2 |    Vino |  20 |   11 |
|  10 |   Peter |  19 |   12 |

3、在MySQL中实现Rank普通并列排名函数

现在,如果我们希望为并列数据的行赋予相同的排名,则意味着那些在排名比较列中具有相同值的行应在MySQL中计算排名时保持相同的排名(例如在我们的例子中的age)。为此,我们使用了一个额外的变量。

SELECT pid, name, age,
CASE
WHEN @prevRank = age THEN @curRank
WHEN @prevRank := age THEN @curRank := @curRank + 1
END AS rank
FROM players p,
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY age
| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    2 |
|   3 |    John |  20 |    2 |
|  11 |     Tom |  20 |    2 |
|   5 |   Brian |  21 |    3 |
|   4 |    Andy |  22 |    4 |
|   9 |  George |  23 |    5 |
|   6 |     Dew |  24 |    6 |
|   7 |    Kris |  25 |    7 |
|   1 |  Samual |  25 |    7 |
|   8 | William |  26 |    8 |

如上所示,具有相同数据和排行的两行或多行,它们都会获得相同的排名。玩家Andre, Vino, John 和Tom都有相同的age,所以他们排名并列第二。下一个最高age的玩家(Brian)排名第3。这个查询相当于MSSQL和ORACLE 中的DENSE_RANK()函数。

4、在MySQL中实现Rank高级并列排名函数

当使用RANK()函数时,如果两个或以上的行排名并列,则相同的行都会有相同的排名,但是实际排名中存在有关系的差距。

SELECT pid, name, age, rank FROM
(SELECT pid, name, age,
@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank,
@incRank := @incRank + 1,
@prevRank := age
FROM players p, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
) r
ORDER BY age) s

这是一个查询中的子查询。我们使用三个变量(@incRank,@prevRank,@curRank)来计算关系的情况下,在查询结果中我们已经补全了因为并列而导致的排名空位。我们已经封闭子查询到查询。这个查询相当于MSSQL和ORACLE中的RANK()函数。

| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    2 |
|   3 |    John |  20 |    2 |
|  11 |     Tom |  20 |    2 |
|   5 |   Brian |  21 |    6 |
|   4 |    Andy |  22 |    7 |
|   9 |  George |  23 |    8 |
|   6 |     Dew |  24 |    9 |
|   7 |    Kris |  25 |   10 |
|   1 |  Samual |  25 |   10 |
|   8 | William |  26 |   12 |

在这里我们可以看到,Andre,Vino,John和Tom都有相同的age,所以他们排名并列第二。下一个最高年龄的球员(Brian)排名第6,而不是第3,因为有4个人并列排名在第2。

好的,我希望在这些例子后,能让你了解RANK()和DENSE_RANK()之间的区别,并且知道在哪里应使用哪个查询来获取MySQL中的rank函数。

作者:风澈vio
链接:https://www.jianshu.com/p/bb1b72a1623e

mysql 排名_学会在MySQL中实现Rank高级排名函数,所有取前几名问题全部解决.相关推荐

  1. 在MySQL中实现Rank高级排名函数

    在MySQL中实现Rank高级排名函数 前言 用例表 1.在MySQL中实现普通排名 2.在MySQL中实现并列连续序号排名 3.在MySQL中实现并列非连续序号排名 4.随机获得一条数据 5.判断数 ...

  2. rank()函数 mysql_在MySQL中实现Rank高级排名函数

    在MySQL中实现Rank高级排名函数 MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可 ...

  3. mysql rank_在MySQL中实现Rank高级排名函数

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

  4. access排名_在Microsoft Access中对行进行排名

    access排名 This is the third article on row numbers in Microsoft Access. 这是有关Microsoft Access中行号的第三篇文章 ...

  5. 计算机二级mysql难度_计算机二级科目怎么选 科目难度排名

    计算机二级考试是计算机等级考试中,重要的一个级别考试.通过了二级考试是有很多好处的.计算机二级包括很多科目,该怎么选择科目们? 计算机二级科目怎么选 (1)作为一个非计算机专业的在校生,建议在VF和V ...

  6. php7.2 mysql 教程_如何在PHP7中扩展mysql,先安装php7.2。后安装mysql

    相对与PHP5,PHP7的最大变化之一是移除了mysql扩展,推荐使用mysqli或者pdo_mysql,实际上在PHP5.5开始,PHP就着手开始准备弃用mysql扩展,如果你使用mysql扩展,可 ...

  7. 虚拟机开启mysql服务_远程操作虚拟机中的mysql服务器

    一.查看系统端口号开发状态: 查看 服务器端口号: grep servicename /etc/services: netstat -an | grep servicename 首先需要开启3306端 ...

  8. java 读取mysql日志_如何在MySQL中查看日志文件?

    我已经读过Mysql服务器创建了一个日志文件,它记录了所有活动 - 比如何时执行查询和执行什么查询 . 谁能告诉我我的系统中存在哪些内容?我怎么读呢? 基本上,我需要使用不同的输入备份数据库[两个日期 ...

  9. mysql重传_浅谈 MySQL 中的事务和 ACID

    所谓事务(Transaction),就是通过确保成批的操作要么完全执行,要么完全不执行,来维护数据库的完整性.举一个烂大街的例子:A 向 B 转账 1000 元,对应的 SQL 语句为:(没有显式定义 ...

最新文章

  1. 新视界,你好!_只愿与一人十指紧扣_新浪博客
  2. jquery通过ajax提交form
  3. Selenium_WebDriver操作iFrame日历框和复选框_Java
  4. python程序题斐波那契数列_Python编程题9--斐波那契数列
  5. 第一批做移动开发的程序员,现在怎么样了?
  6. Resumable.js - 基于HTML5 File API的可断点续传的文件上传插件
  7. ObjC学习4-多态、动态类型、动态绑定及异常处理
  8. svn图标不显示的解决方案
  9. 晶体二极管的分类大全
  10. 思科模拟器的远程连接交换机的实现
  11. 使用three.js创建粒子火焰效果
  12. java mac转unix_管理Java类路径(UNIX和Mac OS X)
  13. java解析HL7协议报文工具(v24版)
  14. HCIA-Big Data华为认证大数据工程师在线课程笔记
  15. 基于Eclipse+Java Swing + Mysql图书管理系统
  16. 概论_第8章_假设检验的基本步骤__假设检验的类型
  17. c#用串口传输二进制文件 xmodem协议
  18. 嫦娥四号工程总共投入是多少?国家航天局回应
  19. android签名方法,Android : apk系统签名的多种方法
  20. 2018 年上半年网络工程师考试上午真题

热门文章

  1. 怎样把文件传到华为云服务器,如何把文件传到云服务器上
  2. java子类和父类实例_java中父类与子类之间的转换示例
  3. 辩论计算机未来不能取代书本的问题,电脑不能取代书本辩论会材料.doc
  4. php tls,使用TLS在PHP中建立连接
  5. System.out.println(i++); System.out.println(++i);的区别
  6. 怎样使用navicat将mysql的数据表导出保存(转储SQL文件)
  7. [Vo. 1 No. 1] 高等代数一题[Sep. 19, 2013]
  8. 从零开始的全栈工程师——js篇2.12(面向对象)
  9. PhpStorm之操作数据库
  10. linux中使用lftp上传下载文件