看了一些文章,終于知道該怎么在 mysql 里面實現 row_number() 排序
話不多說,show you the code:
第一步:建表:
1
2
3
4
5
|
create table grades( ` name ` varchar (10), `subject` varchar (10), `score` int (10) ) |
第二步:寫入數據
1
2
3
4
5
6
7
8
9
10
11
12
13
|
insert into grades( name , subject, score) values ( '小明' , '語文' , 85), ( '小華' , '語文' , 89), ( '小李' , '語文' , 91), ( '小芳' , '語文' , 93), ( '小明' , '數學' , 77), ( '小華' , '數學' , 95), ( '小李' , '數學' , 83), ( '小芳' , '數學' , 88), ( '小明' , '英語' , 90), ( '小華' , '英語' , 92), ( '小李' , '英語' , 85), ( '小芳' , '英語' , 88) |
數據如下:
第三步:
需求:找出各科目單科第二的同學
首先,先排序:
1
2
3
|
select name , subject, score from grades order by subject, score desc |
數據如下:
然后,每個科目按照分組排序
1
2
3
4
5
6
7
8
9
10
11
|
select (@i:= case when @subject_pre=t1.subject then @i+1 else 1 end ) as rn, t1.*, (@subject_pre:=subject) from ( select name , subject, score from grades order by subject, score desc ) t1, ( select @i:=0, @subject_pre:= '' ) as t2 group by subject, score order by subject, score desc |
解釋一下:
添加一個比較項 subject_pre, 記錄前一個科目是什么。
再加上一個自增的序列,實現index+1的功能。
因為數據已經是有序的,如果指向的科目和存儲的前一個科目相同,那么序號+1,否則的話,序號從1開始重新計算。
這樣就實現了分組排序。
最后,把 rn=2 的數據取出來
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
select name , subject, score from ( select (@i:= case when @subject_pre=t1.subject then @i+1 else 1 end ) as rn, t1. name , t1.subject, t1.score, (@subject_pre:=subject) from ( select name , subject, score from grades order by subject, score desc ) t1, ( select @i:=0, @subject_pre:= '' ) as t2 group by subject, score order by subject, score desc ) t where rn=2 |
最后結果如下:
這樣就使用mysql實現了row_number()的功能。
在網上找的資料,很多沒寫清楚,這里特地用一個示例把這個實現講清楚了,希望對你有幫助!
到此這篇關于mysql使用自定義序列實現row_number功能的文章就介紹到這了,更多相關mysql row_number功能內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/bigband/p/15716205.html