【问题标题】:MySql, where clause filter off entries even with LEFT join [duplicate]MySql,即使使用 LEFT 连接,where 子句也会过滤条目 [重复]
【发布时间】:2020-01-18 17:59:19
【问题描述】:

3 个表:classes、students 和 class_student(关联表)。以下查询输出每个班级的学生人数。当班级没有学生时,count(..) 为 0,但班级名称仍在结果中。

select c.name, count(s.id)
from classes c
    left join
  class_student cs on cs.classId = c.id
    left join
  students s on s.id = cs.studentId
group by c.id;

现在要计算每个班级得分 100% 的学生,因此添加了 WHERE:

select c.name, count(s.id)
from classes c
    left join
  class_student cs on cs.classId = c.id
    left join
  students s on s.id = cs.studentId
where s.score = 100  <-- newly added
group by c.id;

那么没有 100% 学生的班级不会出现在结果中。考虑到使用了 LEFT JOIN,我希望 count(s.id) 在没有 100% 的学生时返回 0。我怎样才能使所有课程都在结果中,而那些没有任何 100% 学生的课程的 count(..) 输出为 0。谢谢

【问题讨论】:

  • 这两个重复的问题显示了两种不同的解决方案:将过滤条件移动到连接条件中或使用条件计数。

标签: mysql sql


【解决方案1】:

额外的条件应该放在ON子句而不是WHERE子句中,如:

select c.name, count(s.id)
from classes c
    left join
  class_student cs on cs.classId = c.id
    left join
  students s on s.id = cs.studentId
            and s.score = 100  <-- newly added
group by c.id;

如果您将它放在 WHERE 子句中,您实际上是在击败外连接并将其自动转换为内连接(就像您无意中所做的那样)。

【讨论】:

  • 感谢您在我发帖后不到 30 秒内回复。它解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2012-10-19
  • 2020-05-05
  • 2011-12-02
  • 2022-01-20
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 2019-02-15
相关资源
最近更新 更多