2010-05-18 83 views
1

我在查詢中有一個簡單的連接,但是我需要在這兩個表上有一個條件「confirm ='yes'」,但是如果其中一個表沒有任何匹配查詢返回沒有行。MySQL和一個連接中的每個表的替代方案

數據庫:

.----------parties----------. 
| id - party_id - confirmed | 
|---------------------------| 
| 1  1   yes | 
| 1  2   no  | 
| 1  3   no  | 
+---------------------------+ 

.-----------events----------. 
| id - event_id - confirmed | 
|---------------------------| 
| 1  1   no  | 
+---------------------------+ 

.----------parties----------. 
| id - party_id - confirmed | 
|---------------------------| 
| 1  1   no  | 
| 1  2   no  | 
| 1  3   no  | 
+---------------------------+ 

.-----------events----------. 
| id - event_id - confirmed | 
|---------------------------| 
| 1  1   yes | 
+---------------------------+ 

查詢:

SELECT p.party_id, e.event_id 
FROM parties p 
LEFT JOIN events e 
ON p.id=e.id 
WHERE p.id = '1' 
AND p.party_id IN (1,2,3) 
AND e.event_id IN (1) 
AND p.confirmed='yes' 
AND e.confirmed='yes' 

它返回什麼,但我希望它有一個空的事項標識或事項標識和一個空返回party_id 1 party_id。我希望這是有道理的,我不會錯過任何東西,謝謝你的幫助!

編輯加反向數據庫的代碼,我需要返回事項標識和空party_id

回答

2

WHERE條件篩選出由LEFT JOIN產生的所有NULLs

此舉涉及eventsON條款的所有條件:

SELECT p.party_id, e.event_id 
FROM parties p 
LEFT JOIN 
     events e 
ON  e.id = p.id 
     AND e.event_id IN (1) 
     AND e.confirmed = 'yes' 
WHERE p.id = '1' 
     AND p.party_id IN (1, 2, 3) 
     AND p.confirmed = 'yes' 
UNION ALL 
SELECT p.party_id, e.event_id 
FROM events e 
LEFT JOIN 
     parties p 
ON  p.id = e.id 
     AND p.party_id IN (1, 2, 3) 
     AND p.confirmed = 'yes' 
WHERE e.event_id IN (1) 
     AND e.confirmed = 'yes' 
     AND p.id IS NULL 
+0

感謝您的回答,它的工作原理,但它有沒有辦法讓它工作在反向? I.E.所有當事方確認=否,並確認事件=是 – Scott 2010-05-18 10:21:18

+0

@Scott:請使用示例數據集和所需輸出更新您的問題。 – Quassnoi 2010-05-18 10:25:15

+0

我將其添加到問題中,感謝您的幫助! – Scott 2010-05-18 10:31:55