码迷,mamicode.com
首页 > 数据库 > 详细

一个学生分数表,用sql语句查询出各班级的前三名

时间:2016-08-10 19:28:31      阅读:1354      评论:0      收藏:0      [点我收藏+]

标签:

昨天去一家公司面试,被这道题难住了,哎,又失去一次好的机会。

回来 之后就再想这个问题

 

表结构及数据如下:

技术分享

实现的sql语句:

刚开始的实现是

select * from student a where a.id in (SELECT b.id from student b where b.classId=a.classId ORDER BY grade DESC LIMIT 0,3) ;
看起来没毛病,其实一大堆,第一 对于mysql来说,in(里面不能使用limit) 有语法错误,第二 前三名不一定就只有3位哦

尝试改:语句理解:也就是只要班级里有三个学生的分数超过这个学生,那么这个学生就不是前三名。

select * from student b
where
not EXISTS(select * from student c where c.classId=b.classId and b.grade < c.grade GROUP BY c.classId HAVING COUNT(*)>3 )

 

结果显示

 

技术分享

 

查询次数统计

not exists 其实是嵌套循环。如果student有1000条数据,则会查询1+1000次,如果还不理解,就用java代码协助下

List<Student> students =studentService.queryAll();//查询出全部

for(int i=0;i<students.length();i++){

   //过滤前三名

   //查询是不是班级前三名

}

所以总共查询1+n次,n表示student表的总条数

 

感觉不靠谱,如果有10W条数据,就查询了10W次,真是受不了的,再想想,有好方法的朋友快来围观,十分感激!

 

一个学生分数表,用sql语句查询出各班级的前三名

标签:

原文地址:http://www.cnblogs.com/freefenglei/p/5757874.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!