2011-12-05 129 views
1

我有一個查詢,它使用2個表上的自聯接來返回單行結果。我遇到的問題是,如果seat1是空的,我什麼都沒有返回。LEFT/RIGHT JOIN不返回空行

SELECT seat1.seat_type_id 
    , seat1.seat_type_qty 
    , seat2.seat_type_id 
    , seat2.seat_type_qty 
    FROM jos_sv_apptpro2_requests AS R 
    LEFT JOIN jos_sv_apptpro2_seat_counts AS seat1 ON R.id_requests = seat1.request_id 
    LEFT JOIN jos_sv_apptpro2_seat_counts AS seat2 ON R.id_requests = seat2.request_id 
WHERE (seat1.seat_type_id = 6 AND seat2.seat_type_id = 7) 
    AND R.id_requests = 8703 
    AND R.resource = 3 

這應返回:

seat_type_id 6 
seat_type_qty 0 <= this is the empty row 
seat_type_id1 7 
seat_type_qty 1 

編輯: 現在我已經得到了:

SELECT 
IFNULL(seat1.seat_type_qty,0) AS seat_type_qty, 
IFNULL(seat2.seat_type_qty,0) AS seat_type_qty 
FROM jos_sv_apptpro2_requests AS R 
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat1 
ON R.id_requests = seat1.request_id AND seat1.seat_type_id = 6 
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat2 
ON R.id_requests = seat2.request_id AND seat2.seat_type_id = 7 
WHERE R.id_requests = 8696 

重新編輯! - 我的錯誤是,我在PHP中返回seat_type_qty兩次作爲對象。全部排序 - 謝謝!

回答

3
WHERE seat1.seat_type_id = 6 AND seat2.seat_type_id = 7 

是刪除所有具有NULL值的行的內容。你應該將這些條件連接標準,使得RDBMS做你期待什麼:

LEFT JOIN jos_sv_apptpro2_seat_counts AS seat1 ON R.id_requests = seat1.request_id 
               AND seat1.seat_type_id = 6 
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat2 ON R.id_requests = seat2.request_id 
               AND seat2.seat_type_id = 7 
+0

你美麗!非常感謝 - 有用的技術知道 – Jeepstone

+0

@Jeepstone:這不是一種真正的技術......它是如何加入工作!當沒有匹配時,OUTER JOIN操作填充具有NULL值的行,並且在所有連接執行完畢後應用WHERE過濾器。 – Benoit

+0

我明白了。不知道現在我上面有什麼錯,但是我得到的結果比預期的要少。 – Jeepstone

1

移動你的where子句到聯接:

LEFT JOIN jos_sv_apptpro2_seat_counts AS seat1 
    ON (R.id_requests = seat1.request_id) AND (seat1.seat_type_id = 6) 
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

當你有他們在where子句中,你對整行進行匹配。在JOIN中執行它只會對正在加入的特定記錄進行過濾。