网站保留密码 怎么做,vps docker wordpress,专做恐怖片的网站,ui设计培训多长时间MySQL中没有Rank排名函数#xff0c;当我们需要查询排名时#xff0c;只能使用MySQL数据库中的基本查询语句来查询普通排名。尽管如此#xff0c;可不要小瞧基础而简单的查询语句#xff0c;我们可以利用其来达到Rank函数一样的高级排名效果。在这里我用一个简单例子来实现…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 age2、查询以降序排列首要按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这是一个查询中的子查询。我们使用三个变量(incRankprevRankcurRank)来计算关系的情况下在查询结果中我们已经补全了因为并列而导致的排名空位。我们已经封闭子查询到查询。这个查询相当于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 |在这里我们可以看到AndreVinoJohn和Tom都有相同的age所以他们排名并列第二。下一个最高年龄的球员(Brian)排名第6而不是第3因为有4个人并列排名在第2。好的我希望在这些例子后能让你了解RANK()和DENSE_RANK()之间的区别并且知道在哪里应使用哪个查询来获取MySQL中的rank函数。作者风澈vio链接https://www.jianshu.com/p/bb1b72a1623e