mysql 實現排行榜 mysql之排名實現

2021-10-17 15:12:23 字數 3433 閱讀 3369

前言: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 使用 ...