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

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

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

CREATE TABLE `players` (

`pid` int(2) NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

`age` int(2) NOT NULL,

PRIMARY KEY (`pid`),

UNIQUE KEY `name` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

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函数。谢谢。

mysql rank_在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 排名_学会在MySQL中实现Rank高级排名函数,所有取前几名问题全部解决.

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

  4. MySql: 替换某个字段中的指定字符串——replace函数

    最近因图片地址更改,需要替换掉前缀部分. replace函数 语法:replace(object,search,replace) 语义:把object对象中出现的的search全部替换成replace ...

  5. MYSQL实现排名函数RANK,DENSE_RANK和ROW_NUMBER

    文章目录 1. 排名分类 1.1 区别RANK,DENSE_RANK和ROW_NUMBER 1.2 分组排名 2. 准备数据 3. 不分组排名 3.1 连续排名 3.2 并列跳跃排名 3.3 并列连续 ...

  6. MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用

    转载 窗口函数简介 MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数. 开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据 ...

  7. mysql8 rank_MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用

    窗口函数简介MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数. 开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据返回一条 ...

  8. SQL点滴20—T-SQL中的排名函数

    提到排名函数我们首先可能想到的是order by,这个是排序,不是排名,排名需要在前面加个名次序号的,order by是没有这个功能的.还可能会想到identity(1,1),它也给了一个序号,但是不 ...

  9. mysql over rank_sql - MySQL中的Rank函数

    sql - MySQL中的Rank函数 我需要找出客户的排名. 在这里,我为我的要求添加了相应的ANSI标准SQL查询. 请帮我转换为MySQL. SELECT RANK() OVER (PARTIT ...

最新文章

  1. Imagination发布四款RISC-V CPU
  2. php long2ip,php ip2long和long2ip函数实现
  3. 二十年最强悍病毒排行榜
  4. Windows10 对系统盘C 有效清理
  5. 数据结构 - 树形选择排序 (tree selection sort) 具体解释 及 代码(C++)
  6. Ferguson游戏
  7. Java JNI初探
  8. 《App后台开发运维与架构实践》第3章 App后台核心技术
  9. 学模拟电路的神器everycircuit
  10. svg标签的CSS3动画特效 - 经典特效2
  11. java装箱_Java 装箱 拆箱
  12. (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
  13. 华为拿百亿资金给员工分红,预计每股1.58元
  14. myeclipse自带tomcat
  15. java 注解开发 解耦_Android java 解耦框架注解Dagger2
  16. 索纳塔进入wince系统_23项高级安全驾驶辅助系统环绕 第十代索纳塔新手女司机的福音...
  17. shark恒破解笔记6-BC++假自效验
  18. 微信小程序 添加分割线
  19. AUC(Area under Curve Roc曲线下面积)计算方法总结
  20. 【网络通讯开发系列】如何使用C语言编程通过UDP通讯解析域名

热门文章

  1. 如何提取论文中的表格数据(pdf转换excel)
  2. [转]词根词缀记单词3-主讲victor老师
  3. Required request body is missing错误
  4. 关于弹出消息窗口的自动关闭
  5. 百度飞桨:给出关键词,AI自动生成元宵节祝福~
  6. 爬王者荣耀图片源码,战国
  7. 2021校园PHP表白墙程序源码
  8. 嵌入式uClinux及其应用开发(1)
  9. c语言大作业 模拟泊松分布,怎样用C语言模拟泊松分布
  10. 什么是大数据?什么是物联网?