前言:mysql沒有實現類似排名(rank)功能的函式。但是我們可以通過基數的查詢加上其他函式可是實現類似的功能。
題目:編寫乙個 sql 查詢來實現分數排名。
一:首先我們建立一張並插入一些資料如下,用於方便後面排名的演示。
create table`players` (
`pid`int(2) not nullauto_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);
二:簡單排名,相同的年紀隨機分配排名次序
select pid, name, age, @currank := @currank + 1 asrankfromplayers p, (select @currank := 0) qorder by age
解題分析:宣告乙個session級別的變數(注意在sql中宣告變數需要在變數名前加@)。
步驟一:在子查詢中宣告乙個變數,並初始化為0。在select函式每記錄一行資料變數加1(在select函式後『:=』為賦值操作)。
結果:| 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 |
備註1:我們通過子查詢把宣告變數和select函式通過一條語句完成(利用子查詢)。我們也可以分離宣告變數和查詢分開如備註2
備註2:分離宣告變數和查詢分,通過兩條sql。
sql1set @currank := 0;
sql2select pid, name, age, @currank := @currank + 1 asrankfromplayersorder by age
三:相同的分數需有相同的排名名次,排名無間隙
selectpid, name, age,case
when @prevrank = age then @currank
when @prevrank := age then @currank := @currank + 1
end asrankfromplayers 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 |
備註3:分析sql
case
when @prevrank = age then @currank
when @prevrank := age then @currank := @currank + 1
end第乙個 when @prevrank = age then @currank 。 是判斷語句,用於判斷上一條資料的年紀和當前資料的年紀是否相等,如果為true,返回當前排名。如果為false,繼續執行下一條when
第二個 when @prevrank := age then @currank := @currank + 1 。是賦值,即把當前年齡賦值@prevrank(賦值操作總是返回為true),並排名加一。
四:相同的分數需有相同的排名名次,排名有間隙
select pid, name, age, rank from(selectpid, name, age,@currank := if(@prevrank = age, @currank, @incrank) asrank,@incrank := @incrank + 1,@prevrank :=agefromplayers p, (select @currank :=0, @prevrank := null, @incrank := 1) rorder 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 |
備註:mysql中if(expr1,expr2,expr3)函式是我們熟悉的三目運算函式。即if expr1 is true (expr1 <> 0 and expr1 <> null), if() returns expr2. otherwise, it returns expr3.
mysql製作排行榜 mysql實現排行榜
博主新人一枚,大家可以提出自己的寶貴意見。下來我們進入正題。大家首先要了解介面的場景,再就是排行榜的規則,我們這裡說的中國式排行榜。排行榜總結了一下分為3種 中國式排行 非中國式排行1 非中國式排行2 1 1 1 2 2 2 2 2 3 3 4 4 3 5 5 4 5 6 5 7 7 select ...
mysql查詢排行榜 mysql 查詢排名
sql語句查詢排名 思路 有點類似迴圈裡面的自增一樣,設定乙個變數並賦予初始值,迴圈一次自增加1,從而實現排序 mysql裡則是需要先將資料查詢出來並先行按照需要排序的字段做好降序desc,或則公升序asc,設定好排序的變數 初始值為0 a 將已經排序好的資料從第一條依次取出來,取一條就自增加一,實...
redis實現排行榜
排行榜功能是乙個很普遍的需求。設想在乙個遊戲中,有上百萬的玩家資料,如果現在需要你根據玩家的經驗值整理乙個前20名的排行榜,你會怎麼做呢?你不可能 order by limit 去實現 select from game socre order by score desc limit 0,20 使用 ...