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

时间:2011-01-30 12:03:50

标签: mysql left-join join

我有4张表如下; SCHEDULES SCHEDULE_OVERRIDE SCHEDULE_LOCATION_OVERRIDES LOCATION

我需要从所有表中返回所有行,因此运行此查询可以正常工作,为任何不存在的值添加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

欣赏任何想法/评论。

最好的问候,本。

3 个答案:

答案 0 :(得分:4)

您是否尝试将其放入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

答案 1 :(得分:3)

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

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

因此,在这种情况下将WHERE子句移动到schedule_override的ON部分,你应该没问题。

答案 2 :(得分:1)

是的,当您离开连接时,可能是找不到行,并且结果中的字段为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'
  ...