MySQL實現Rank高階排名函式

2021-09-24 12:55:36 字數 4640 閱讀 4405

mysql中沒有rank排名函式,當我們需要查詢排名時,只能使用mysql資料庫中的基本查詢語句來查詢普通排名。儘管如此,可不要小瞧基礎而簡單的查詢語句,我們可以利用其來達到rank函式一樣的高階排名效果。

在這裡我用乙個簡單例子來實現排名的查詢:

首先我們先建立乙個我們需要進行高階排名查詢的players表,

create

table

`players`

(`pid`

int(2)

notnull

auto_increment

,`name`

varchar(50

)not

null

,`age`

int(2)

notnull

,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

);

在這裡,我們希望獲得乙個排名字段的列,以及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

現在,如果我們希望為並列資料的行賦予相同的排名,則意味著那些在排名比較列中具有相同值的行應在mysql中計算排名時保持相同的排名(例如在我們的例子中的age)。為此,我們使用了乙個額外的變數。

select pid, name, age,

case

when

@prevrank

= age then

@currank

when

@prevrank := age then

@currank :=

@currank+1

endas rank

from players p,

(select

@currank :=0,

@prevrank :=

null

) rorder

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()函式。

注意:case when @prevrank := age then @currank := @currank + 1這裡的賦值語句@prevrank := age主要作用是賦值,賦值語句也為true,所以也可以用來做邏輯判斷

我們這裡要補全因為並列而導致的排名空位。

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

| 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 |

這是乙個查詢中的子查詢。我們使用三個變數(@incrank@prevrank@currank)來計算關係的情況下,在查詢結果中我們已經補全了因為並列而導致的排名空位。我們已經封閉子查詢到查詢。這個查詢相當於mssql和oracle中的rank()函式。

MySQL中實現Rank排名高階函式

先舉例乙個 select name,time,currank currank 1 as rank from 表名,select currank 0 qorder by time1.要在mysql中宣告乙個變數,你必須在變數名之前使用 符號。from子句中的 currank 0 部分允許我們進行變數初...

在MySQL中實現Rank高階排名函式

mysql中沒有rank排名函式,當我們需要查詢排名時,只能使用mysql資料庫中的基本查詢語句來查詢普通排名。儘管如此,可不要小瞧基礎而簡單的查詢語句,我們可以利用其來達到rank函式一樣的高階排名效果。在這裡我用乙個簡單例子來實現排名的查詢 首先我們先建立乙個我們需要進行高階排名查詢的playe...

在MySQL中實現Rank高階排名函式

mysql中沒有rank排名函式,當我們需要查詢排名時,只能使用mysql資料庫中的基本查詢語句來查詢普通排名。儘管如此,可不要小瞧基礎而簡單的查詢語句,我們可以利用其來達到rank函式一樣的高階排名效果。在這裡我用乙個簡單例子來實現排名的查詢 首先我們先建立乙個我們需要進行高階排名查詢的playe...