题目
有一个courses 表 ,有: student (学生) 和 class (课程)。
请列出所有超过或等于5名学生的课。
例如,表:
+---------+------------+
| student | class |
+---------+------------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
+---------+------------+
应该输出:
+---------+
| class |
+---------+
| Math |
+---------+
Note:
学生在每个课中不应被重复计算。
审题
题目最后在强调,学生在每个课中不应被重复计算。
就是如果存在重修的情况比如有两个(A, 'Math') 这时需要考虑去重
这是一个坑,剩下的应该就没什么了
自己的解答
先对数据进行去重 将其作为临时表tmp
(select distinct *
from courses) tmp
对于tmp 对class进行分组 再利用having进行分组筛选
select tmp.class
from (select distinct *
from courses) tmp
group by tmp.class
having count(tmp.class) >=5;
通过咯 一定要注意需要去重的坑
别的方法
不用子查询也可以实现的
许多人没有考虑到去重高的情况就会得到如下答案
select tmp.class
from courses
group by tmp.class
having count(class) >=5;
其实对这个进行一个修正也可以达到去重的目的
分组后筛选统计学生的数量也是可行的 再对学生进行去重就达到了我们的目的
select class
from courses
group by class
having count(distinct student) >=5;
这个显然是最好的答案