MySQL - 在添加WHERE子句时出现LEFT JOIN失败

问题描述:

我有4个表格,如下所示; 时间表SCHEDULE_OVERRIDESCHEDULE_LOCATION_OVERRIDESLOCATIONMySQL - 在添加WHERE子句时出现LEFT JOIN失败

我需要从所有表返回所有的行,以便运行此查询工作正常,将NULL值中不存在任何值:

SELECT..... 
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id) 
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id 
LEFT JOIN location l ON slo.location_id = l.id 
ORDER BY s.id, so.id, slo.id, l.id 

然后,我需要在schedule_override end_date字段上重新记录结果。我的问题是,只要我这样做,根本没有返回SCHEDULE表的结果。即使覆盖end_date标准不符合,我也需要返回所有时间表。

我使用什么样的继承人:

SELECT..... 
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id) 
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id 
LEFT JOIN location l ON slo.location_id = l.id 
WHERE so.end_date > '2011-01-30' OR so.end_date IS NULL 
ORDER BY s.id, so.id, slo.id, l.id 

欣赏任何想法/评论。

最好的问候,本。

你有没有试过把它放在ON条款?

SELECT..... 
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id AND (so.end_date > '2011-01-30' OR so.end_date IS NULL)) 
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id 
LEFT JOIN location l ON slo.location_id = l.id 
ORDER BY s.id, so.id, slo.id, l.id 
+0

是的,这样做!非常感谢,我一直在为此奋斗一段时间。 此致,本。 – Ben 2011-01-30 12:19:58

是的,当您离开连接时,可能是找不到行,并且结果中该字段为NULL。在WHERE子句中添加条件时,该值必须与该条件匹配,如果该条件为NULL,则不会。

这应该不是问题,因为你明确地检查NULL,所以我不知道为什么这个条件失败,除非它确实返回一个日期,但是这个日期是2011-01-30 。

无论如何,你可以尝试将条件移动到连接。它将消除检查NULL的需求,尽管它不应该有真正的区别。

SELECT..... 
FROM 
    schedule s 
    LEFT JOIN schedule_override so 
    ON so.schedule_id = s.id 
    AND so.end_date > '2011-01-30' 
    ... 

这是外连接的一个相当常见的错误。

您需要将限制Join的所有内容放入该表的“ON”部分,否则您将有效地将连接转换为内部连接。

因此,将本例中的WHERE子句移入schedule_override的ON部分,您应该没问题。