參考自:MySQL中實(shí)現(xiàn)rank排名查詢(xún)_JustryDeng-CSDN博客_mysql rank
基本知識(shí):
- sql語(yǔ)句中管钳,使用
@
來(lái)定義一個(gè)變量辕狰, 如:@a
- sql語(yǔ)句中,使用
:=
來(lái)給變量賦值吏垮,如@a:=1
,則變量a的值為1- sql語(yǔ)句中贸辈,
if(A,B,C)
表示泪姨,如果A條件成立,那么執(zhí)行B削祈,否則執(zhí)行C翅溺,如@abc := if(2>1,100,200)
的結(jié)果是a的值賦值為100。case…when…then
語(yǔ)句髓抑。case…when…then
語(yǔ)句有兩種情況咙崎,分別為CASE后面不帶表達(dá)式和CASE后面帶表達(dá)式。# CASE后面不帶表達(dá)式情況 CASE WHEN expression THEN 操作1 WHEN expression THEN 操作2 ....... ELSE 操作n END # CASE后面帶表達(dá)式情況 CASE expression WHEN expression的值1 THEN 操作1 WHEN expression的值2 THEN 操作2 ....... ELSE 操作n END
一吨拍、前提
先創(chuàng)建一個(gè)table褪猛,并放入一些數(shù)據(jù),如:
表rank_test
二羹饰、排序
1. age升序排序(age相同時(shí)伊滋,排名繼續(xù)增加)
SELECT
id,NAME,age,@curRank := @curRank + 1 AS rank
FROM
rank_test p,( SELECT @curRank := 0 ) q
ORDER BY
age ASC;
運(yùn)行結(jié)果
注:這里的(SELECT @curRank := 0) q 的作用是:在同一個(gè)select語(yǔ)句中給變量curRank賦初始值。
2. age升序排列(age相同時(shí)严里,排名相同新啼;但是到下一個(gè)age不同時(shí),排名不跳級(jí)刹碾,繼續(xù)+1)
# 示例一(case…when…when):
SELECT
id,NAME,age,
CASE
WHEN @prevRank = age THEN @curRank
WHEN @prevRank := age THEN @curRank := @curRank + 1
END AS rank
FROM
rank_test p,( SELECT @curRank := 0, @prevRank := NULL ) r
ORDER BY age ASC;
# 示例二(IF(a,b,c)):
SELECT
id,NAME,age,IF(@prevRank = age,@curRank,@curRank := @curRank + 1) AS rank,@prevRank := age
FROM
rank_test p,( SELECT @curRank := 0, @prevRank := NULL ) r
ORDER BY
age ASC
示例一運(yùn)行結(jié)果
示例二運(yùn)行結(jié)果
3. age升序排列(age相同時(shí)燥撞,排名相同;但是到下一個(gè)age不同時(shí),排名跳級(jí)+n)
SELECT
id,NAME,age,@curRank :=IF( @prevRank = age, @curRank, @incRank ) AS rank,@incRank := @incRank + 1,@prevRank := age
FROM
rank_test p,( SELECT @curRank := 0, @prevRank := NULL, @incRank := 1 ) r
ORDER BY
age ASC;
運(yùn)行結(jié)果