MySQL中row_number的實(shí)現(xiàn)

oracle等數(shù)據(jù)庫(kù)中可以方便的使用row_number函數(shù),實(shí)現(xiàn)分組取組內(nèi)特定數(shù)據(jù)的功能。但是MySQL中并沒(méi)有引入類似的函數(shù)。為了實(shí)現(xiàn)這一功能,需要一些特別的處理。下面是row_number函數(shù)在MySQL中的實(shí)現(xiàn),實(shí)現(xiàn)方法來(lái)源一篇英文資料,本文借用了其中的方法
源地址

  1. row_number函數(shù)
    函數(shù)是對(duì)分組之后的數(shù)據(jù)進(jìn)行組內(nèi)編號(hào),效果如下:


    按年齡進(jìn)行分組編號(hào)

由于新增了一列num,結(jié)合組內(nèi)的排序,可以很方便的選取組內(nèi)特定的數(shù)據(jù)。

  1. MySQL中用到的知識(shí)
  • case 語(yǔ)句
  • 用戶變量
  1. 實(shí)現(xiàn)步驟
  • 實(shí)現(xiàn)給每一行添加一個(gè)序號(hào)
SET @row_number = 0;
SELECT
    (@row_number:=@row_number + 1) AS num, s.id, s.name, s.age
FROM
    student s;
添加序號(hào)

這里利用用戶變量實(shí)現(xiàn)數(shù)據(jù)自增

  • 分組編號(hào)

SET @row_number=0, @customer_no=0;

SELECT
    @row_number:=CASE
        WHEN @customer_no = s.age THEN @row_number + 1 
        ELSE 1
    END AS num,
    @customer_no:=s.age AS stu_age,
    s.id, 
    s.name 
FROM
    student s
ORDER BY
    s.age;
按年齡分組編號(hào)

customer_no是一個(gè)臨時(shí)變量,每次查詢都被賦值為age。而case中判斷條件在customer_no賦值之前,其實(shí)就是判斷當(dāng)前行age值是否與上一行age值相同。當(dāng)不相同時(shí)重新編號(hào)(輸出1),從而實(shí)現(xiàn)了分組順序編號(hào)的功能。效果與oracle中的row_number函數(shù)相同。

  1. 用戶變量賦值的一種技巧
    可以使用另一種方式替代用戶變量的賦值
SELECT
    @row_number:=CASE
        WHEN @customer_no = s.age THEN @row_number + 1 
        ELSE 1
    END AS num,
    @customer_no:=s.age AS stu_age,
    s.id, 
    s.name 
FROM
    student s, (SELECT @row_number:=0, @customer_no:=0) AS t
ORDER BY
    s.age;

這里將賦值放入select語(yǔ)句內(nèi)部,效果一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,806評(píng)論 18 399
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解...
    上街買菜丶迷倒老太閱讀 1,507評(píng)論 0 20
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,689評(píng)論 0 4
  • 當(dāng)陽(yáng)光灑向了云朵。青春點(diǎn)燃了煙火,不用說(shuō)你和我在一起是必然的結(jié)果。 雖然我們都錯(cuò)過(guò),激情晚點(diǎn)的火車,不要說(shuō)你寂寞了...
    房勇中醫(yī)閱讀 166評(píng)論 0 0
  • 前言 本節(jié)主要編寫一個(gè)靜態(tài)的頁(yè)面,主要是HTML和CSS的基礎(chǔ),與React沒(méi)有什么關(guān)系,這里我們引用的font-...
    Moon_Yue閱讀 600評(píng)論 0 0

友情鏈接更多精彩內(nèi)容