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)源一篇英文資料,本文借用了其中的方法
源地址
-
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ù)。
- MySQL中用到的知識(shí)
- case 語(yǔ)句
- 用戶變量
- 實(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ù)相同。
- 用戶變量賦值的一種技巧
可以使用另一種方式替代用戶變量的賦值
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)部,效果一樣。
