2011-01-30 201 views
1

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

欣賞任何想法/評論。

最好的問候,本。

回答

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 
+0

是的,這樣做!非常感謝,我一直在爲此奮鬥一段時間。 此致,本。 – Ben 2011-01-30 12:19:58

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' 
    ... 
3

這是外連接的一個相當常見的錯誤。

您需要將限制Join的所有內容放入該表的「ON」部分,否則您將有效地將連接轉換爲內部連接。

因此,將本例中的WHERE子句移入schedule_override的ON部分,您應該沒問題。