mysql使用自定義序列實現row_number功能


看了一些文章,終於知道該怎么在 mysql 里面實現 row_number() 排序

話不多說,show you the code:

第一步:建表:

create table grades(
`name` varchar(10),
`subject` varchar(10),
`score` int(10)
)

第二步:寫入數據

insert into grades(name, subject, score)
values('小明', '語文', 85),
('小華', '語文', 89),
('小李', '語文', 91),
('小芳', '語文', 93),
('小明', '數學', 77),
('小華', '數學', 95),
('小李', '數學', 83),
('小芳', '數學', 88),
('小明', '英語', 90),
('小華', '英語', 92),
('小李', '英語', 85),
('小芳', '英語', 88)

數據如下:

第三步:
需求:找出各科目單科第二的同學

首先,先排序:

select name, subject, score 
from grades
order by subject, score desc

數據如下:

然后,每個科目按照分組排序

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 的數據取出來

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()的功能。

在網上找的資料,很多沒寫清楚,這里特地用一個示例把這個實現講清楚了,希望對你有幫助!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM