在MySQL中实现Rank⾼级排名函数
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 |2022年四川公务员考试成绩查询
|  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
链接:www.jianshu/p/bb1b72a1623e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。