我正在尝试查询两个表,即注册和课程。在课程表中,每门课程只有一个条目,但在注册表中,每个学生都有一个条目参加任何课程,因此一门课程可能有30个条目。我的任务是找到注册次数最多的课程,并打印出该课程名称,以及该课程的注册人数。这是我到目前为止的查询
select c.CourseCode ,(SELECT count( * ) FROM Enrollment WHERE CourseCode = c.CourseCode) as test from Course c ;
这给了我结果:
CS227 - 29
CS228 - 34
CS309 - 31
CS311 - 25 ,等等,这很好,但现在,我如何只打印出注册最多的班级(在本例中为CS228)。我尝试过使用max(),但是我无法使用任何东西。
创建表课程( CourseCode char(50), CourseName char(50), PreReq char(6));
创建表注册( CourseCode char(6)NOT NULL, SectionNo int NOT NULL, StudentID char(9)NOT NULL引用Student, 等级char(4)NOT NULL, 主键(CourseCode,StudentID), 外键(CourseCode,SectionNo)引用Offering);
答案 0 :(得分:3)
按照点票顺序排在前1位。
那是:
Select Top 1 A.CourseCode, Count(*) From Course A inner join Enrollment B on (A.CourseCode=B.CourseCode)
Group By A.CourseCode
Order By Count(*) DESC
另外 - 使用我在这里显示的内连接而不是子查询。我倾向于喜欢SubQueries,这个可以工作,但它不适合这种查询!
答案 1 :(得分:0)
根据您的评论,我认为打击查询是您想要的,虽然它未经测试,但我不完全确定HAVING子句是否有效。从MySQL页面上的文档来看,它似乎应该可以工作。
SELECT A.CourseCode, COUNT(*) AS count FROM Course A
JOIN Enrollment B ON A.CourseCode = B.CourseCode
GROUP BY A.CourseCode
HAVING count = MAX(count)
至于性能,我不知道在聚合函数上运行MAX是否是个好主意(可能不是)。
否则,只需使用其他查询返回顶部X,然后直接比较前一个数字。
答案 2 :(得分:0)
SELECT
c.CourseCode,
c.CourseName,
COUNT(*) AS cnt
FROM
Course AS c
INNER JOIN
Enrollment AS e
ON c.CourseCode = e.CourseCode
GROUP BY
c.CourseCode
HAVING
COUNT(*) =
( SELECT
COUNT(*) AS cnt
FROM
Enrollment AS e
GROUP BY
e.CourseCode
ORDER BY
cnt DESC
LIMIT 1
)