MySQL查詢排名

2021-07-30 12:52:42 字數 2414 閱讀 2669

sql語句查詢排名

思路:有點類似迴圈裡面的自增一樣,設定乙個變數並賦予初始值,迴圈一次自增加1,從而實現排序;

首先準備測試資料(使用者id,姓名,性別,分數):

需求:根據分數實現分數由高到低的乙個排名

第一種情況:

將已經排序好的資料從第一條依次取出來,取一條就自增加一,實現從1到最後的乙個排名(意思就是不管分數相同與否,排名依次排序,即:1,2,3,4,5,6,7,……)

sql如下:

select

a.name,

a.score,

@rownum := @rownum + 1 as rownum

from

(select

name,

score

from tab1

order by score desc) as a,

(select @rownum := 0) r

執行的結果如下圖:

可以看到,現在按照分數從1到6都排好序了,但是有些分數相同的使用者排名卻不一樣,這樣就是接下來說的第二種情況。

第二種情況:

當出現相同的資料時,排名保持不變,此時則需要再設定乙個變數,用來記錄上一條資料的值,跟當前資料的值進行對比,如果相同,則排名不變,不相同則排名自增加1(意思就是只要資料有相同的排名就一樣,排名依次排序,即1,2,2,3,3,4,5……)

sql如下:

select

a.name,

a.score,

case

when @rowtotal = a.score then

@rownum

when @rowtotal := a.score then

@rownum :=@rownum + 1

when @rowtotal = 0 then

@rownum :=@rownum + 1

end as rownum

from

(select

name,

score

from tab1

order by score desc) as a,

(select @rownum := 0 , @rowtotal := null) r

這時候就新增加了乙個變數,用於記錄上一條資料的分數了,只要當前資料分數跟上一條資料的分數比較,相同分數的排名就不變,不相同分數的排名就加一,並且更新變數的分數值為該條資料的分數,依次比較

執行的結果如下圖:

如果你需要分數相同的排名也相同,但是後面的排名不能受到分數相同排名相同而不佔位的影響,也就是哪怕你排名相同,你也佔了這個位置(比如:1,2,2,4,5,5,7……這種形式的,雖然排名有相同,但是你佔位了,後續的排名根據佔位來排,也就是我要說的第三種情況)

第三種情況:

當出現相同的資料時,排名保持不變,但是保持不變的排名依舊會占用乙個位置,也就是類似於(1,2,2,2,5即雖然三個人並列第二名,但是第三和第四名的位置也會被占用)這種排名就是屬於中間的三個排名是一樣的,但是第五個排名按照上面一種情況是(1,2,2,2,3),現在則是排名相同也會佔據排名的位置

為了讓大家更加直觀的對比第一種情況與第三種情況的差別,在sql中我又增加了乙個變數,來記錄第一種情況的排名(num_tmp為第一種情況的排名,rownum為第三種情況的排名)

sql如下:

select

a.name,

a.score,

@rownum := @rownum + 1 as num_tmp,

@incrnum := case

when @rowtotal = a.score then @incrnum

when @rowtotal := a.score then @rownum

end as rownum

from

(select

name,

score

from tab1

order by score desc) as a,

(select @rownum := 0 , @rowtotal := null ,@incrnum := 0) r

執行的結果如下圖:

mysql 查詢字段排名 mysql 查詢排名

sql語句查詢排名 思路 有點類似迴圈裡面的自增一樣,設定乙個變數並賦予初始值,迴圈一次自增加1,從而實現排序 mysql裡則是需要先將資料查詢出來並先行按照需要排序的字段做好降序desc,或則公升序asc,設定好排序的變數 初始值為0 a 將已經排序好的資料從第一條依次取出來,取一條就自增加一,實...

mysql 當前排名查詢 mysql排名查詢

排名函式的型別 row number函式 不考慮並列名次的情況。比如前3名是並列的名次,row number函式排名之後是正常的1,2,3,4。通用的mysql排名解法 由於mysql8.0才有視窗函式解決排名問題,之前的版本需要自行實現排名函式,我寫了一些通用的sql套用以上的排名場景,以下sql...

mysql 查詢排名

sql語句查詢排名 思路 有點類似迴圈裡面的自增一樣,設定乙個變數並賦予初始值,迴圈一次自增加1,從而實現排序 mysql裡則是需要先將資料查詢出來並先行按照需要排序的字段做好降序desc,或則公升序asc,設定好排序的變數 初始值為0 a 將已經排序好的資料從第一條依次取出來,取一條就自增加一,實...