MySQL NULL结果

时间:2016-12-09 04:27:28

标签: mysql null

我在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   |

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值将为NULLCOUNT会忽略该结果集,从而导致正确的零计数

请注意,我删除了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

如果这不会给您带来任何结果,那么实际上没有教师与任何学生相关联,并且您的数据存在问题。

以下是使用示例数据的演示。它按预期工作:

SQLFiddle