mysql @value := 用法

來源:互聯網
上載者:User

標籤:排列   條件   分享   code   png   weight   存在   har   sel   

背景

有這麼一張表,記錄名字和分數,現在需要按照成績排名,存在並列名次的情況

 

解決方案

思路:按照score從大到小排序,第一行資料就是第一名,第二行就是第二名......需要判斷當前行的score和上一行的score的大小用來區分是否排名

 

先看解決代碼:

SELECT name,scoreCASEWHEN @preScore = score THEN @curRank WHEN @preScore := score THEN @curRank:=@curRank +1END AS `Rank` FROM score,(SELECT @curRank := 0 AS curRank, @preScore := NULL AS preRank) i WHERE sex=1 ORDER BY score DESC 

 

 

細節說明

 @preScore 這種是變數聲明,類似之前的set ,set @a = 1;

:=  賦值,@preScore := 1,表示給@preScore賦值為1;

(SELECT @curRank := 0 AS curRank, @preScore := NULL AS preRank) i 單獨派生出一個表,記得要加別名,不然會包如下的錯誤
Every derived table must have its own alias -- 派生出來的表都要有一個別名

  新增兩列的表,一列是當前排名curRank,一個是上條記錄的score值preScore,賦予預設值,curRank=0,preScore=null;

下面的操作類似linux中的awk操作

1. 按照score倒序排列,即score最大的一行,第一名的一條記錄;

2. 先判斷@preScore是否跟當前查詢出來的score一致,因為預設@preScore為null,那不一致,不執行THEN後面的;

3. 進入到第二個WHEN,THEN中

4. 將當前查詢出來的score=99賦值給@preScore,沒有判斷條件直接進入到THEN,@curRank=0+1,為1

5. 將@curRank 寫為別名Rank=1

6. 第二條記錄掃描

7. 先判斷@preScore(此時為99)跟第二條記錄的score(此時為89)對比,不相等,不執行THEN後面的資料;

8. 將當前查詢出來的score=89賦值給@preScore,沒有判斷條件直接進入到THEN,@curRank=1+1,為2

9. 將@curRank 寫為別名Rank=1

......

掃描完所有的記錄後得到上表

case函數只返回第一個合格值,剩下的case部分將會被自動忽略。

當有score一樣的情況時,@preScore=score時,@curRank並沒有做+1操作,所以就有了並列的情況

 

mysql @value := 用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.