MySQl查询前三名(包括并列)
有时候会遇到这样的需求,那就是需要查询出前n名的信息。如果是不考虑并列的情况,那就简单了直接使⽤
排序加limit便可搞定。但是当考虑并列的情况是就不⼀样了。那么这个时候该怎么办呢?
不废话了,直接讲思路。我们可以把查询分为两部分。**⼀部分⽤于查询去除重复条件下的前n名成绩。第⼆部
分⽤户取出在这个区间的所有成员信息。**
来⼀个实战:
⾸先是成绩信息表,表名为te:
下⾯就是sql语句:
select aa.*
from
(
select DISTINCT name as n1,
(
select sum(mark)
from te
where name=n1
)as g
from te t
) aa
where aa.g in
(
ade as g
from
(
select
(select sum(mark)
from te
where name=t1.name
)as grade
from te t1
GROUP BY grade desc LIMIT 3
) as ta
)
看起来很复杂的样⼦,其实的确挺复杂的。下⾯来解释⼀下,⾸先我们要取出(这⾥是实现排名前三)在除去重复情况下的前三名的成绩:
select (select sum(mark) from te where name=t1.name)as grade from te t1 GROUP BY
grade desc LIMIT 3
把每个⼈的总成绩计算出来,然后通过group by就可以去除重复,”desc“降序排序。limit 3取前三条。
这⾥使⽤了关键字limit,由于in后⾯的条件不能直接跟limit,所以将上⾯查询出来的结果放到⼀张ta表⾥,再进⾏⼀次查询。
(ade as g from (select (select sum(mark) from te where name=t1.name)
as grade from te t1 GROUP BY grade desc LIMIT 3) as ta)
好的,到这⾥就把去除重复条件下的前三名成绩取出来了。下⾯就该取学⽣信息了。通过将总成绩算出来之后,⽤in
关键字去匹配上⾯的结果集便可。
那么问题⼜来了,**我们查出的总成绩是通过计算得出的,并不是表的字段。所以这⾥要⽤到别名来保存。但是呢,
我们⼜要⽤这个别名去做匹配。好的,我们都知道where后⾯是不能直接跟上别名的。解决⽅法跟上⾯是⼀样的,就
是先把查出的结果集放到⼀张表⾥,然后再进⾏⼀次查询便可**
select aa.* from (select DISTINCT name as n1,(select sum(mark) from te where name=n1)
as g from te t) aa where aa.g in (结果集)
查询结果截图:
好的,以上就是我个⼈的⼀个解决⽅法了。那么也希望⼤家有什么更好的解决⽅法也能分享给我。
最后⽅便⼤家测试,将建表的sql语句以及插⼊数据的sql语句附在后⾯:
create table te (
name char(20) ,
lesson char(20),
mark float
)
insert into te values('john','Math',60);
insert into te values('john','Eng',50);
insert into te values('john','HIstory',56);
select distinct from
insert into te values('Mike','Eng',51);
insert into te values('Mike','Math',59);
insert into te values('Mike','HIstory',55);
insert into te values('Mark','Eng',71);
insert into te values('Mark','Math',89);
insert into te values('Mark','HIstory',95);
insert into te values('mm','Eng',61);
insert into te values('mm','Math',79);
insert into te values('mm','HIstory',85);
insert into te values('f','Eng',51);
insert into te values('f','Math',69);
insert into te values('f','HIstory',95);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。