MySQL5.0 非分組排名

在MySQL中,不存在相似於SQL Server或Orcal等中的rank()函數來獲得排名;因此咱們須要手動地寫這個rank功能。html

基本知識

  1. sql語句中,使用@來定義一個變量。如:@abc
  2. sql語句中,使用:=來給變量賦值,:@abc:=123,則變量abc的值爲123
  3. sql語句中,if(A,B,C)表示,若是A條件成立,那麼執行B,不然執行C,如:
    @abc := if(2>1,100,200)的結果是,abc的值爲100。
  4. ◎case...when...then語句
    case...when...then語句有兩種狀況:
    case狀況一(CASE 後面不帶表達式):

CASE WHEN expression THEN 操做1程序員

           WHEN expression THEN 操做2sql

            .......express

           ELSE 操做n函數

ENDspa

注:自上而下,凡是走了其中一個when或者是走了else了,其餘的都再也不走了。.net

        case狀況二(CASE 後面帶表達式,此時WHEN 後面的則是該表達式可能的值):htm

CASE expressionblog

WHEN  expression的值1 THEN  操做1get

WHEN  expression的值2 THEN  操做2

     .......

    ELSE 操做n

END 

注:自上而下,凡是走了其中一個when或者是走了else了,其餘的都再也不走了。

MySQL中,手寫rank示例

先建立一個tablle,並放入一些數據,如:

  age升序排列(age相同時,排名繼續增長),示例:

注:這裏的(SELECT @curRank := 0)  q  的做用是:在同一個select語句中給變量curRank賦初始值。效果等
        同於,兩個sql語句,第一個先賦值,第二個再select:

age降序排列(age相同時,排名繼續增長),示例:

age升序排列(age相同時,排名相同;可是到下一個age不一樣時,排名不跳級,繼續+1),示例一(case...when...then):

age升序排列(age相同時,排名相同;可是到下一個age不一樣時,排名不跳級,繼續+1),示例二if(a,b,c)

age升序排列(age相同時,排名相同;可是到下一個age不一樣時,排名跳級+n),示例:

注:若是嫌查出來的列太多了,能夠再對此結果進行select,如:

 

^_^ 若有不當之處,歡迎指正

^_^ 參考連接:
              https://www.jianshu.com/p/bb1b72a1623e
              
https://blog.csdn.net/tjuyanming/article/details/77825875
              https://zhidao.baidu.com/question/336737352.html

^_^ 本文已經被收錄進《程序員成長筆記(二)》,做者JustryDeng

相關文章
相關標籤/搜索