mysql獲取排列序號(hào)的三種常用方法小結(jié)
在進(jìn)入正題之前先來(lái)了解一個(gè)mysql中的小知識(shí)點(diǎn):
① := 與 = 的區(qū)別
:= 賦值的意思。在set update select 中表示賦值的意思,用的比較少一般都用=,但是在用變量實(shí)現(xiàn)行號(hào)時(shí)(比如本文標(biāo)題獲取排列序號(hào)),一定要用:=。
= 等于的意思,只有當(dāng)set 和 update時(shí),和:=的意思是一樣的,表示賦值,其余情況都是等于的意思。
② 用戶變量 @
@rank 是對(duì)一個(gè)叫rank的參數(shù)進(jìn)行賦值。對(duì)用戶變量賦值有兩種方式,一種直接用"="另一種用":="。其區(qū)別在于使用set命令對(duì)用戶變量賦值時(shí),兩種方式都可以使用;當(dāng)使用select語(yǔ)句對(duì)用戶變量進(jìn)行賦值時(shí),只能使用“:=”方式,因?yàn)樵趕elect語(yǔ)句中,“=”被看做是比較操作符。
好了,現(xiàn)在進(jìn)入正題。
1、根據(jù)某字段按序排列并獲取排序號(hào)。
先寫(xiě)一個(gè)小例子:
SELECT a.*,@rank:=@rank + 1 AS rank_no
FROM (
SELECT *
FROM `logs`
WHERE log_created> "2017-09-01"
ORDER BY count DESC
) a, (SELECT @rank:= 0) b這個(gè)sql的作用是將日志創(chuàng)建時(shí)間在2017.09.01之前的日志按訪問(wèn)量進(jìn)行倒序排序,并返回序號(hào)。(當(dāng)訪問(wèn)量相同的時(shí)候,按正常順序,繼續(xù)排序)。
運(yùn)行結(jié)果如下:

select @rank:= 0 或者 set @rank=0;
這句話其實(shí)就是將rank賦值0,從零開(kāi)始加1編號(hào),上面兩種寫(xiě)法都可以。
用set的那種方法我也列出來(lái)一下,
set @rank= 0;
SELECT a.log_id,a.log_created,a.count,@rank:=@rank + 1 AS rank_no
FROM (
SELECT *
FROM `logs`
WHERE log_update > "2017-09-01"
ORDER BY count DESC
) a;所以,獲取排序序號(hào)還是很簡(jiǎn)單的,基本上都是固定的方式,里面一層select是正常的sql排序的語(yǔ)句,外面一層是對(duì)查到的已排好序的數(shù)據(jù)列進(jìn)行rank自增的操作,所以一開(kāi)始@rank:=0。
其中需要注意的一點(diǎn)是,當(dāng)排名相同時(shí),想讓序號(hào)也一樣該怎么辦,比如上面的查詢結(jié)果id為1707101100和1711131423的訪問(wèn)次數(shù)都是3,上面的sql是將他們按序繼續(xù)編號(hào)的,要是想編號(hào)相同可以這樣解決:
2、根據(jù)某字段按序排列獲取排序號(hào),且當(dāng)該字段的值存在多個(gè)相同的記錄時(shí),則相同值排序號(hào)相同。
SET @rank = 0 ,@rowtotal := NULL; SELECT a.log_id, a.log_created, a.count, CASE WHEN @rowtotal = a.count THEN @rank WHEN @rowtotal := a.count THEN @rank := @rank + 1 END AS rank_no FROM ( SELECT * FROM `logs` WHERE log_update > "2017-09-01" ORDER BY count DESC ) a
運(yùn)行結(jié)果:

從上面的sql語(yǔ)句可以看出多了一句case函數(shù),(rowtotal表示count)根據(jù)情況對(duì)rank進(jìn)行賦值,當(dāng)rowtotal等于count時(shí),序號(hào)就是rank,當(dāng)rowtotal正常賦值時(shí),言下之意就是不等于,但是又不能用!= ,(其實(shí)這樣說(shuō)也不準(zhǔn)確,我也不知道該怎么表達(dá),有知道的人博友可以幫忙補(bǔ)充一下~~~),這樣就實(shí)現(xiàn)了相同記錄編號(hào)相同的目的,同時(shí)其余記錄繼續(xù)編號(hào)。
3、根據(jù)某字段按序排列獲取排序號(hào),且當(dāng)該字段的值存在多個(gè)相同的記錄時(shí),則相同值的記錄的排序號(hào)相同,并且下一組值的排序號(hào)為上一組內(nèi)記錄數(shù)+上一個(gè)排序號(hào)。
同樣先看代碼:
SET @rank = 0 ,@rowtotal := NULL ,@rowtotal1 = NULL ,@sart := 0;
SELECT a.log_id, a.log_created, a.count,
CASE
WHEN @rowtotal = a.count THEN @rank
WHEN @rowtotal := a.count THEN @rank := @rank + 1 + @sart
END AS rank_no,
CASE
WHEN @rowtotal1 = a.count THEN @sart := @sart + 1
WHEN @rowtotal1 := a.count THEN @sart := 0
END AS sart
FROM
(
SELECT *
FROM `logs`
WHERE log_update > "2017-09-01"
ORDER BY count DESC
) a運(yùn)行結(jié)果:

上面的sql里又增加了一個(gè)參數(shù)sart,表示當(dāng)前每次相同的個(gè)數(shù),(同時(shí)還增加了rowtotal1,用于區(qū)別之前的roetotal,因?yàn)樵谶@段sql中rowtotal在運(yùn)行期間已被多次賦值,不適合做sart的比較參數(shù))下一組記錄,將在之前的排名上加上此參數(shù)就表示,下一組記錄的排序編碼。為了再次驗(yàn)證sql準(zhǔn)確性,再看一組運(yùn)行結(jié)果,(調(diào)整日志創(chuàng)建時(shí)間為log_update > "2016-06-20" and log_update < "2017-03-01"),

好了,這三種常用的獲取排列序號(hào)的sql寫(xiě)好了,供大家參考一下,若是有不正確的地方還望大家指出,互相學(xué)習(xí)。
錯(cuò)誤糾正:
上面的sql有個(gè)問(wèn)題就是當(dāng)數(shù)據(jù)是0的時(shí)候,沒(méi)有進(jìn)行特殊處理這個(gè)時(shí)候得到的rank_no是一個(gè)null值,排序就會(huì)出問(wèn)題,下面針對(duì)第三種情況做一下糾正其余的類(lèi)似:
SET @rank = 0 ,@rowtotal := NULL ,@rowtotal1 = NULL ,@sart := 0;
SELECT a.log_id, a.log_created, a.count,
CASE
WHEN @rowtotal = a.count THEN @rank
WHEN @rowtotal := a.count THEN @rank := @rank + 1 + @sart
WHEN @rowtotal = 0 THEN @rank := @rank +1 +@sart
END AS rank_no,
CASE
WHEN @rowtotal1 = a.count THEN @sart := @sart + 1
WHEN @rowtotal1 := a.count THEN @sart := 0
WHEN @rowtotal1 =0 THEN @sart := 0
END AS sart
FROM
(
SELECT *
FROM `logs`
WHERE log_update > "2017-09-01"
ORDER BY count DESC
) a上面的黑體字就是修正后的處理sql。
到此這篇關(guān)于mysql獲取排列序號(hào)的三種常用方法小結(jié)的文章就介紹到這了,更多相關(guān)mysql獲取排列序號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql導(dǎo)入sql文件常用的方法及適用場(chǎng)景
在日常學(xué)習(xí)和工作,難免不了使用Mysql數(shù)據(jù)庫(kù),有時(shí)候需要導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù),或者其中的數(shù)據(jù)表,這篇文章主要介紹了mysql導(dǎo)入sql文件常用的方法及適用場(chǎng)景,需要的朋友可以參考下2025-08-08
MySQL?臨時(shí)表創(chuàng)建與使用詳細(xì)說(shuō)明
MySQL臨時(shí)表是存儲(chǔ)在內(nèi)存或磁盤(pán)的臨時(shí)數(shù)據(jù)表,會(huì)話結(jié)束時(shí)自動(dòng)銷(xiāo)毀,適合存儲(chǔ)中間計(jì)算結(jié)果或臨時(shí)數(shù)據(jù)集,其名稱以#開(kāi)頭(如#TempTable),本文給大家介紹MySQL臨時(shí)表創(chuàng)建與使用詳細(xì)說(shuō)明,感興趣的朋友跟隨小編一起看看吧2025-08-08
Mysql數(shù)據(jù)庫(kù)面試必備之三大log介紹
大家好,本篇文章主要講的是Mysql數(shù)據(jù)庫(kù)面試必備之三大log介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2021-12-12
Mysql GROUP BY查詢每組某值最大的一條數(shù)據(jù)
這篇文章主要介紹了Mysql GROUP BY查詢每組某值最大的一條數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
MySQL高效處理ORDER BY與GROUP BY查詢的優(yōu)化策略
在高并發(fā)、大數(shù)據(jù)量的業(yè)務(wù)場(chǎng)景中,SQL 查詢性能直接影響系統(tǒng)整體響應(yīng)速度,本文將深入探討 MySQL 中排序與分組的執(zhí)行機(jī)制,并提供一系列實(shí)用的優(yōu)化策略,希望對(duì)大家有所幫助2026-02-02
自動(dòng)恢復(fù)MySQL數(shù)據(jù)庫(kù)的日志文件思路分享及解決方案
本文主要講訴如何自動(dòng)恢復(fù)mysql數(shù)據(jù)庫(kù)的日志文件,喜歡的在服務(wù)器或者數(shù)據(jù)庫(kù)上直接操作的兄弟們你值得收藏下!2014-08-08

