1. 程式人生 > >No.5 MYSQL實現 RANK函式排序功能

No.5 MYSQL實現 RANK函式排序功能

 MySQL中不存在類似於SQL Server或Orcal中的rank()函式來得到排名。所以我們需要手動來時先這個函式,先看一下應用場景:

查詢每門課成績最好的前兩名:

select r.cid,score,rank from
(select tmp.cid,tmp.score,if([email protected],@rank:[email protected]+1,@rank:=1) as rank,@tmid:=tmp.cid
from (select cid,score from sc group by cid,score order by cid asc,score desc) tmp,
(select @rank:=0,@tmid:=null)tmp1
) r
where score is not null and rank <=2;

首先,我先講解一下,sql中的@rank是什麼意思,sql中使用@來定義一個變數,同時使用@XXX:= 123 來給@rank變數賦值123

怎麼解釋這段程式碼呢?我們來逐層的解析一下:

首先,我們先選出sc中每一課對應的成績,課號,成績排序:即 select cid,score from sc group by cid,score order by cid asc,score desc


定義變數@rank,@pa,同時和之前的成績表進行連線,結果如下:


@rank表示每個成績對應的排名,@pa的作用我們稍後在介紹

if(A,B,C)在SQL中表示,如果A條件成立,那麼執行B,否則執行C

接下來我們對每個記錄,設定@pa表示上一次記錄的課號,如果當前的課號和@pa一樣,那麼該記錄的@rank就加1,如果@pa和當前的課號不一樣,那麼就說明這記錄時對應課號的首條記錄,那麼rank為1 同時更改該名稱為rank

最後在最外邊的查詢中,投影課號,成績,排名