mysql,求每组前N条记录

直接上代码

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

解释一下:
添加一个比较项 subject_pre, 记录前一个科目是什么。
再加上一个自增的序列,实现index+1的功能。
因为数据已经是有序的,如果指向的科目和存储的前一个科目相同,那么序号+1,否则的话,序号从1开始重新计算。 

建表:

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)

原文地址:https://www.cnblogs.com/bigband/p/15716205.html

posted on 2023-06-27 16:35  sddhome  阅读(21)  评论(0编辑  收藏  举报

导航