尝试这样的事情:
SELECT n.courseid, n.coursename
FROM newcourses n
LEFT JOIN applicants a ON n.courseid = a.courseid
GROUP BY n.courseid, n.coursename
HAVING count(a.id) <=1;
这将获得所有没有任何申请人的课程和只有一个申请人的课程。而且它不使用必须为每个选定的记录运行一次的子查询,因此您也可以获得性能。
这在 newcourses 和申请人表之间使用了 LEFT JOIN。这显示了在申请者表中有记录的 newcourses 的任何元素,但也显示了不在申请者表中的元素(这就是使用 LEFT JOIN 的原因)。
sqlfiddle demo
如果您想单独检查它们,您可以执行以下操作:
要获得没有申请人的课程:
SELECT n.courseid, n.coursename
FROM newcourses n
LEFT JOIN applicants a ON n.courseid = a.courseid
GROUP BY n.courseid, n.coursename
HAVING count(a.id) = 0;
排除有两个申请人的课程:
SELECT n.courseid, n.coursename
FROM newcourses n
LEFT JOIN applicants a ON n.courseid = a.courseid
GROUP BY n.courseid, n.coursename
HAVING count(a.id) != 2;
如果不能超过两个,则可以更改!=为<
如果您最终将新列添加到具有最大申请人数的新课程中,则不能将其放在外部 HAVING COUNT 中,因此您必须执行子查询:
SELECT n.courseid, n.coursename
FROM newcourses n
LEFT JOIN applicants a ON n.courseid = a.courseid
WHERE n.maxApplicants >= (SELECT count(*)
FROM applicants ap WHERE ap.courseid = n.courseid)
GROUP BY n.courseid, n.coursename