昨天去一家公司面试,被这道题难住了,哎,又失去一次好的机会。
回来 之后就再想这个问题
表结构及数据如下:
实现的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次,真是受不了的,再想想,有好方法的朋友快来围观,十分感激!