给定架构:
Student(Snum, Sname)
Course(Cnum, Cname)
Prerequisite(Cnum, Prereq)
Professor(Pnum,Pname, Dept, Office)
Enrollment(Snum, Cnum, Term, Section, Mark)
Schedule(Cnum, Term, Section, Days, Time, Room)
Class(Cnum, Term, Section, Instructor)
我想出了:
SELECT * FROM Student s
HAVING MIN(
SELECT COUNT(*) FROM Enrollment e
WHERE e.Snum = s.Snum
GROUP BY e.Term
) > 6
但我得到:
/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT COUNT(*) FROM Enrollment e WHERE e.Snum = s.Snum GROUP BY e.Term ) >' at line 3 */
知道如何解决这个问题吗?谢谢!
此外,知道我有正确的逻辑会让人放心 =)
编辑:最终答案...
SELECT Student.Sname
FROM(
SELECT COUNT(DISTINCT Cnum) as `classes`, e.Term as `term`, e.Snum as `student`
FROM Enrollment e
GROUP BY e.Term, e.Snum
) x
JOIN Student ON Student.Snum = `student`
WHERE x.`classes` > 6
最佳答案
如果您想查看每个学期至少上过 6 门课的学生:
SELECT * FROM Student s
WHERE (SELECT MIN(perTerm) FROM(
SELECT COUNT(DISTINCT Cnum) as perTerm FROM Enrollment e
WHERE e.Snum = s.Snum
GROUP BY e.Term
)) > 6
给你。您已经快到了,但是如果您没有 GROUP BY
,则无法使用 HAVING
。
如果您想要任何术语,请将 MIN
替换为 MAX
,如果您想要特定术语,请使用 Vegard 的更新版本。
如果双子查询不起作用,请尝试这个:
SELECT `student`
FROM(
SELECT COUNT(DISTINCT Cnum) as `classes`, s.Term as `term`, s.Snum as `student`
FROM Enrollment e
GROUP BY e.Term, e.Snum
)
GROUP BY `term`
HAVING MIN(`classes`) > 6
关于MySQL:列出一个学期注册超过 6 个(不同)类(class)的学生(Sname),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4040312/