MySQL - 在添加WHERE子句时出现LEFT JOIN失败
问题描述:
我有4个表格,如下所示; 时间表,SCHEDULE_OVERRIDE,SCHEDULE_LOCATION_OVERRIDES和LOCATIONMySQL - 在添加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
答
是的,当您离开连接时,可能是找不到行,并且结果中该字段为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部分,您应该没问题。
是的,这样做!非常感谢,我一直在为此奋斗一段时间。 此致,本。 – Ben 2011-01-30 12:19:58