2013-05-15 67 views
1

所以,我有這樣的SQL查詢:三左連接在行返回意想不到的結果

select 
    o.id, 
    o.name, 
    d.name, 
    w.day, 
    o.suspended 
from resource o 
    left join resource d on d.vehicle_ID = o.ID 
    left join week_days_availability_to_resource aw on d.ID=aw.resource_ID 
    left join week_days_availability w on aw.calendar_ID=w.ID 
where o.IS_DELETED <> true 
     and (d.IS_DELETED is null or d.IS_DELETED <> true) 
     and o.marketId = 98 
     and (w.day = 3 or w.day is null) 
     and (o.suspended <> true or o.id in (-1)) 

它返回我需要的所有行 - excep只是一個。表resource o中有一行與resource d連接,然後連接week_days_availability_to_resource(表中有一些行,resource_ID等於d.ID)。問題是week_days_availability中沒有行,day等於三,所以它不返回任何內容。但我期望mysql返回值day字段這一行返回 - 因爲我認爲這是left join實際上是什麼。好像我錯了。
任何想法?

回答

2

我認爲你需要將where條件移入on條款。

from resource o 
    left join resource d on d.vehicle_ID = o.ID 
    left join week_days_availability_to_resource aw on d.ID=aw.resource_ID 
    left join week_days_availability w on aw.calendar_ID=w.ID and w.day = 3 
where o.IS_DELETED <> true 
     and (d.IS_DELETED is null or d.IS_DELETED <> true) 
     and o.marketId = 98 
     and (w.day = 3 or w.day is null) 
     and (o.suspended <> true or o.id in (-1)) 

的問題是,w.day可能等於其他一些值,比如4 left join條件(如最初寫的),但它不符合條件where。通過將條件移入on子句中,沒有匹配,您將獲得NULL。

+0

謝謝你的回覆,我把這個條件移到了'on'子句中,但是現在我又遇到了另一個問題 - 所有行的'day'字段都等於'NULL',即使我檢查我的查詢,日「實際上是'3'。很奇怪。 – aga

+0

@aga。 。 。這實際上很有意義 - 左連接將返回3或NULL。這似乎是你想要的基礎上的問題「問題是,沒有排在day_days_availability一天等於三,所以它什麼都沒有返回。」 –

相關問題