最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql獲取排列序號的三種常用方法小結(jié)

 更新時間:2024年03月07日 10:16:08   作者:crainnogao  
這篇文章主要介紹了mysql獲取排列序號的三種常用方法,并通過代碼示例和圖文給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下

在進入正題之前先來了解一個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 > &quot;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。

到此這篇關(guān)于mysql獲取排列序號的三種常用方法小結(jié)的文章就介紹到這了,更多相關(guān)mysql獲取排列序號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql導入sql文件常用的方法及適用場景

    mysql導入sql文件常用的方法及適用場景

    在日常學習和工作,難免不了使用Mysql數(shù)據(jù)庫,有時候需要導入導出數(shù)據(jù)庫,或者其中的數(shù)據(jù)表,這篇文章主要介紹了mysql導入sql文件常用的方法及適用場景,需要的朋友可以參考下
    2025-08-08
  • CentOS 7下使用RPM安裝mysql5.7.13

    CentOS 7下使用RPM安裝mysql5.7.13

    這篇文章主要為大家詳細介紹了CentOS 7下使用RPM安裝mysql5.7.13的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySQL?臨時表創(chuàng)建與使用詳細說明

    MySQL?臨時表創(chuàng)建與使用詳細說明

    MySQL臨時表是存儲在內(nèi)存或磁盤的臨時數(shù)據(jù)表,會話結(jié)束時自動銷毀,適合存儲中間計算結(jié)果或臨時數(shù)據(jù)集,其名稱以#開頭(如#TempTable),本文給大家介紹MySQL臨時表創(chuàng)建與使用詳細說明,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • Mysql數(shù)據(jù)庫面試必備之三大log介紹

    Mysql數(shù)據(jù)庫面試必備之三大log介紹

    大家好,本篇文章主要講的是Mysql數(shù)據(jù)庫面試必備之三大log介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2021-12-12
  • MySQL執(zhí)行狀態(tài)的查看與分析

    MySQL執(zhí)行狀態(tài)的查看與分析

    今天小編就為大家分享一篇關(guān)于MySQL執(zhí)行狀態(tài)的查看與分析,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Mysql GROUP BY查詢每組某值最大的一條數(shù)據(jù)

    Mysql GROUP BY查詢每組某值最大的一條數(shù)據(jù)

    這篇文章主要介紹了Mysql GROUP BY查詢每組某值最大的一條數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • mysql索引失效的常見九種原因圖文詳解

    mysql索引失效的常見九種原因圖文詳解

    索引失效這個問題的前提應該是建立了索引,卻沒有使用到,或者沒有完全使用到,下面這篇文章主要給大家介紹了關(guān)于mysql索引失效的常見九種原因的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • MySQL高效處理ORDER BY與GROUP BY查詢的優(yōu)化策略

    MySQL高效處理ORDER BY與GROUP BY查詢的優(yōu)化策略

    在高并發(fā)、大數(shù)據(jù)量的業(yè)務場景中,SQL 查詢性能直接影響系統(tǒng)整體響應速度,本文將深入探討 MySQL 中排序與分組的執(zhí)行機制,并提供一系列實用的優(yōu)化策略,希望對大家有所幫助
    2026-02-02
  • 自動恢復MySQL數(shù)據(jù)庫的日志文件思路分享及解決方案

    自動恢復MySQL數(shù)據(jù)庫的日志文件思路分享及解決方案

    本文主要講訴如何自動恢復mysql數(shù)據(jù)庫的日志文件,喜歡的在服務器或者數(shù)據(jù)庫上直接操作的兄弟們你值得收藏下!
    2014-08-08
  • MySQL 虛擬列和虛擬索引的實現(xiàn)

    MySQL 虛擬列和虛擬索引的實現(xiàn)

    虛擬列是MySQL 5.7開始引入的新特性,本文主要介紹了MySQL 虛擬列和虛擬索引的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08

最新評論

曲麻莱县| 阳春市| 万盛区| 抚松县| 东港市| 西乌珠穆沁旗| 荥经县| 安陆市| 汤阴县| 孝义市| 赫章县| 清原| 双峰县| 鸡西市| 景宁| 阳城县| 大英县| 临桂县| 望谟县| 大关县| 巴南区| 名山县| 红河县| 金阳县| 辽阳县| 三江| 华蓥市| 武宁县| 辉县市| 景东| 罗定市| 星座| 乐业县| 鄂温| 集安市| 扶绥县| 景德镇市| 舟曲县| 红安县| 北碚区| 伊通|