我在MySQL工作。我有以下查询:
SELECT tar.ID, COUNT(tsr.StudentID) AS Students
FROM Teacher_ApplicationRecord tar
LEFT JOIN Teacher_StudentRecord tsr ON sar.ID = tsr.TeacherID AND tsr.Session = 1 AND tsr.Year = 2017
WHERE tar.ApplicationYear = 2017
AND tar.Session1 = 1
此查询不返回任何结果。但是,如果我从COUNT(tsr.StudentID)
语句中取出SELECT
,则会返回tsr表中NULL
的所有教师ID。
我想要的是一个查询,它返回所有教师ID以及分配给该教师的学生人数,如果结果为NULL
则为0。
到目前为止,我已尝试COALESCE(COUNT(tsr.StudentID), 0)
和IFNULL(COUNT(tsr.StudentID), 0)
但没有成功。还有其他想法吗?
更新 tsr表有4列:TeacherID,StudentID,Year,Session。它还没有记录。明年,当学生被分配到教师时,它将被填充。
tar表中包含TeacherID
的列表以及其他一些数据,例如年份和教师。
我希望我的结果如下所示:
+-----------+-----------------+
| TeacherID | COUNT(StudentID)|
+-----------+-----------------+
| 1 | 0 |
+-----------+-----------------+
| 2 | 0 |
+-----------+-----------------+
etc.
当学生被分配到教师时,COUNT(学生ID)数字会上升。希望这会有所帮助。
更新2 tar表看起来像这样:
+---------+---------------+
|TeacherID|ApplicationYear|
+---------+---------------+
| 1 | 2017 |
+---------+---------------+
| 2 | 2017 |
+---------+---------------+
| 3 | 2017 |
+---------+---------------+
它有其他列,但它们与问题无关。
tsr表如下所示:
+---------+---------+----+-------+
|TeacherID|StudentID|Year|Session|
+---------+---------+----+-------+
| 1 | 10 |2017| 1 |
+---------+---------+----+-------+
| 1 | 11 |2017| 1 |
+---------+---------+----+-------+
| 2 | 12 |2017| 1 |
答案 0 :(得分:0)
您可以尝试将教师表加入学生表(按此顺序),然后使用GROUP BY
计算每位教师的学生人数:
SELECT tsr.ID,
COUNT(sar.ID) AS numOfStudents -- count no matching students as zero
FROM Teacher_StudentRecord tsr
LEFT JOIN Student_ApplicationRecord sar
ON tsr.TeacherID = sar.ID AND
tsr.Session = 1 AND
tsr.Year = 2017
GROUP BY tsr.ID
此处LEFT JOIN
的有用性是教师没有匹配学生的边缘情况。在这种情况下,在聚合发生之前,结果集将具有该教师的单个记录,并且学生ID值将为NULL
,COUNT
会忽略该结果集,从而导致正确的零计数
请注意,我删除了WHERE
子句,其预期逻辑已包含在ON
子句中。这个WHERE
条款通过删除之前的教师记录来删除您的结果。甚至可以汇总这些记录。
<强>更新强>
请尝试以下查询,看看是否有结果:
SELECT tsr.ID,
COUNT(sar.ID) AS numOfStudents
FROM Teacher_StudentRecord tsr
LEFT JOIN Student_ApplicationRecord sar
ON tsr.TeacherID = sar.ID
GROUP BY tsr.ID
如果这不会给您带来任何结果,那么实际上没有教师与任何学生相关联,并且您的数据存在问题。
以下是使用示例数据的演示。它按预期工作: