mysql獲取排列序號的三種常用方法小結(jié)
在進入正題之前先來了解一個mysql中的小知識點:
① := 與 = 的區(qū)別
:= 賦值的意思。在set update select 中表示賦值的意思,用的比較少一般都用=,但是在用變量實現(xiàn)行號時(比如本文標題獲取排列序號),一定要用:=。
= 等于的意思,只有當set 和 update時,和:=的意思是一樣的,表示賦值,其余情況都是等于的意思。
② 用戶變量 @
@rank 是對一個叫rank的參數(shù)進行賦值。對用戶變量賦值有兩種方式,一種直接用"="另一種用":="。其區(qū)別在于使用set命令對用戶變量賦值時,兩種方式都可以使用;當使用select語句對用戶變量進行賦值時,只能使用“:=”方式,因為在select語句中,“=”被看做是比較操作符。
好了,現(xiàn)在進入正題。
1、根據(jù)某字段按序排列并獲取排序號。
先寫一個小例子:
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
這個sql的作用是將日志創(chuàng)建時間在2017.09.01之前的日志按訪問量進行倒序排序,并返回序號。(當訪問量相同的時候,按正常順序,繼續(xù)排序)。
運行結(jié)果如下:
select @rank:= 0 或者 set @rank=0;
這句話其實就是將rank賦值0,從零開始加1編號,上面兩種寫法都可以。
用set的那種方法我也列出來一下,
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;
所以,獲取排序序號還是很簡單的,基本上都是固定的方式,里面一層select是正常的sql排序的語句,外面一層是對查到的已排好序的數(shù)據(jù)列進行rank自增的操作,所以一開始@rank:=0。
其中需要注意的一點是,當排名相同時,想讓序號也一樣該怎么辦,比如上面的查詢結(jié)果id為1707101100和1711131423的訪問次數(shù)都是3,上面的sql是將他們按序繼續(xù)編號的,要是想編號相同可以這樣解決:
2、根據(jù)某字段按序排列獲取排序號,且當該字段的值存在多個相同的記錄時,則相同值排序號相同。
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
運行結(jié)果:
從上面的sql語句可以看出多了一句case函數(shù),(rowtotal表示count)根據(jù)情況對rank進行賦值,當rowtotal等于count時,序號就是rank,當rowtotal正常賦值時,言下之意就是不等于,但是又不能用!= ,(其實這樣說也不準確,我也不知道該怎么表達,有知道的人博友可以幫忙補充一下~~~),這樣就實現(xiàn)了相同記錄編號相同的目的,同時其余記錄繼續(xù)編號。
3、根據(jù)某字段按序排列獲取排序號,且當該字段的值存在多個相同的記錄時,則相同值的記錄的排序號相同,并且下一組值的排序號為上一組內(nèi)記錄數(shù)+上一個排序號。
同樣先看代碼:
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
運行結(jié)果:
上面的sql里又增加了一個參數(shù)sart,表示當前每次相同的個數(shù),(同時還增加了rowtotal1,用于區(qū)別之前的roetotal,因為在這段sql中rowtotal在運行期間已被多次賦值,不適合做sart的比較參數(shù))下一組記錄,將在之前的排名上加上此參數(shù)就表示,下一組記錄的排序編碼。為了再次驗證sql準確性,再看一組運行結(jié)果,(調(diào)整日志創(chuàng)建時間為log_update > "2016-06-20" and log_update < "2017-03-01"),
好了,這三種常用的獲取排列序號的sql寫好了,供大家參考一下,若是有不正確的地方還望大家指出,互相學習。
錯誤糾正:
上面的sql有個問題就是當數(shù)據(jù)是0的時候,沒有進行特殊處理這個時候得到的rank_no是一個null值,排序就會出問題,下面針對第三種情況做一下糾正其余的類似:
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。
到此這篇關于mysql獲取排列序號的三種常用方法小結(jié)的文章就介紹到這了,更多相關mysql獲取排列序號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mysql中STR_TO_DATE函數(shù)使用(字符串轉(zhuǎn)為日期/時間值)
這篇文章主要給大家介紹了關于Mysql中STR_TO_DATE函數(shù)使用的相關資料,STR_TO_DATE函數(shù)的主要功能是字符串轉(zhuǎn)為日期/時間值,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-09-09解決mysql安裝時出現(xiàn)error Nr.1045問題的方法
這篇文章主要為大家詳細介紹了解決mysql安裝時出現(xiàn)error Nr.1045問題的方法,感興趣的小伙伴們可以參考一下2016-06-06mysql通過binlog定時備份數(shù)據(jù)庫與恢復的方法
這篇文章主要介紹了mysql通過binlog定時備份數(shù)據(jù)庫與恢復的方法,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-12-12用VirtualBox構(gòu)建MySQL測試環(huán)境的筆記
這篇文章主要介紹了如何用VirtualBox構(gòu)建MySQL測試環(huán)境,特分享下,方便需要的朋友2013-08-08mysql中全連接full join...on...的用法說明
這篇文章主要介紹了mysql中全連接full join...on...的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Mysql?InnoDB?的內(nèi)存結(jié)構(gòu)詳情
這篇文章主要介紹了Mysql InnoDB的內(nèi)存結(jié)構(gòu)詳情,InnoDB存儲引擎的邏輯存儲結(jié)構(gòu)是什么呢,下面我們就一起進入文章了解更多詳細內(nèi)容吧,感興趣的小伙伴可以參考一下2022-05-05