在where子句中使用count:无效使用组函数

时间:2015-11-08 21:47:57

标签: mysql sql

我是数据库的初学者。我在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或者究竟是什么问题? 提前谢谢。

编辑:这不是一个家庭作业问题(教授已经发布了解决方案),我正在努力解决这个问题。

3 个答案:

答案 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)

您无法在COUNT子句中使用WHERE,而是必须使用HAVING

  

HAVING子句已添加到SQL,因为WHERE关键字不能与聚合函数一起使用。

此外,你想要GROUP BY学生。因此得到的查询是:

SELECT s.sno, s.sName
FROM STUDENTS s INNER JOIN ENROLL e on s.sno=e.sno
GROUP BY s.sno, s.sName
HAVING COUNT(*)>1;