mysql中沒有rank排名函式,當我們需要查詢排名時,只能使用mysql資料庫中的基本查詢語句來查詢普通排名。儘管如此,可不要小瞧基礎而簡單的查詢語句,我們可以利用其來達到rank函式一樣的高階排名效果。
在這裡我用乙個簡單例子來實現排名的查詢:
首先我們先建立乙個我們需要進行高階排名查詢的players表,
create tableplayers
(
pid
int(2) not null auto_increment,
name
varchar(50) not null,
age
int(2) not null,
primary key (pid
),
unique keyname
(name
)
) engine=innodb default charset=latin1;
insert intoplayers
(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
) qorder by age
pidname
agerank
10peter191
12andre202
2vino203
3john204
11tom205
5brian216
4andy227
9george238
6dew249
7kris
2510
1samual
2511
8william
2612
要在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
) qorder by age desc, name
pidname
agerank
8william261
7kris252
1samual253
6dew244
9george235
4andy226
5brian217
12andre208
3john209
11tom
2010
2vino
2011
10peter
1912
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
pidname
agerank
10peter191
12andre202
2vino202
3john202
11tom202
5brian213
4andy224
9george235
6dew246
7kris257
1samual257
8william268
如上所示,具有相同資料和排行的兩行或多行,它們都會獲得相同的排名。玩家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
) rorder by age) s
這是乙個查詢中的子查詢。我們使用三個變數(@incrank,@prevrank,@currank)來計算關係的情況下,在查詢結果中我們已經補全了因為並列而導致的排名空位。我們已經封閉子查詢到查詢。這個查詢相當於mssql和oracle中的rank()函式。
pidname
agerank
10peter191
12andre202
2vino202
3john202
11tom202
5brian216
4andy227
9george238
6dew249
7kris
2510
1samual
2510
8william
2612
在這裡我們可以看到,andre,vino,john和tom都有相同的age,所以他們排名並列第二。下乙個最高年齡的球員(brian)排名第6,而不是第3,因為有4個人並列排名在第2。
好的,我希望在這些例子後,能讓你了解rank()和dense_rank()之間的區別,並且知道在**應使用哪個查詢來獲取mysql中的rank函式。謝謝。
via
在MySQL中實現Rank高階排名函式
mysql中沒有rank排名函式,當我們需要查詢排名時,只能使用mysql資料庫中的基本查詢語句來查詢普通排名。儘管如此,可不要小瞧基礎而簡單的查詢語句,我們可以利用其來達到rank函式一樣的高階排名效果。在這裡我用乙個簡單例子來實現排名的查詢 首先我們先建立乙個我們需要進行高階排名查詢的playe...
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...