我是数据库的初学者。我在mySQL上练习。我有两张桌子:
STUDENTS
sno | sName | age
ENROLL
sno | cno
我想要一份已注册多门课程的学生名单。 当我试着这个时:
select distinct s.* from student s, enroll e
where ((s.sno = e.sno) and (count(e.sno)>1));
我收到此错误:
“无效使用群组功能”
你能告诉我为什么我不能在where子句中使用count或者究竟是什么问题? 提前谢谢。
编辑:这不是一个家庭作业问题(教授已经发布了解决方案),我正在努力解决这个问题。
答案 0 :(得分:4)
您只能在COUNT()
子句中使用HAVING
等聚合函数,或者在使用SELECT
时使用GROUP BY
子句中的聚合函数。 WHERE
子句对来自FROM
子句的行进行操作。没有聚合,因此聚合函数无法有意义。
看起来你想要做的是从ENROLL表中找到出现不止一次的所有学生。然后,您想了解有关这些学生的更多详细信息。有很多方法可以做到这一点,但我建议使用子查询。
SELECT s.*
FROM student AS s
JOIN (
SELECT e.sno
FROM enroll AS e
GROUP BY e.sno
HAVING COUNT(*) > 1
) AS e
ON e.sno = s.sno
ORDER BY s.age DESC
LIMIT 10
JOIN
之后的子查询执行第一次计算(学生在ENROLL中有多行),并且基本上生成一个带有学生ID列表的伪表。由于我们正在进行内连接,因此只有STUDENT表中在子查询中有sno
的行才会显示。这基本上由ON
条款处理。
由于您在评论中说您希望能够对学生应用其他条件,我在一些示例代码中添加了可能会发生的情况。由于该信息来自STUDENT表,因此可以在子查询外部完成。你并没有特别具体地说“最老的学生”是什么意思,所以我只是假设你想要10个最老的学生参加多门课程。您应该能够根据自己的需要进行调整。
如果其中任何一项没有意义,请告诉我,我会尝试更详细地解释。
答案 1 :(得分:1)
您可以使用:
SELECT aa.sno, aa.sName, aa.age
FROM students AS aa
INNER JOIN (
SELECT sno, COUNT(*)
FROM enroll
GROUP BY sno
HAVING COUNT(*) > 1
) AS _aa
ON aa.sno = _aa.sno;
答案 2 :(得分:1)