2010-12-13 31 views
1

我想從三個表中提取數據,但如果數據不存在於第三個表中,則應從其他兩個表中提取數據。來自三個表的數據

我現在有一個查詢:

SELECT m.name, m.zipcode, p.lat, p.lon, meta.meta_value 
FROM members AS m 
INNER JOIN zipcodes AS p ON m.zipcode = p.zipcode 
INNER JOIN usermeta AS meta ON m.id = meta.id 
WHERE m.zipcode = p.zipcode AND meta.meta_key = 'image' m.country = "USA" 

m.idmeta.id不存在對所有的人。

對於那些有m.id的人來說,「圖像」並不存在。

我想從其他兩個表中提取數據,而不管是否存在「image」和m.id

我該怎麼做?

回答

0

如何更改查詢到

SELECT m.name, m.zipcode, p.lat, p.lon, meta.meta_value 
FROM members AS m 
INNER JOIN zipcodes AS p ON m.zipcode = p.zipcode 
LEFT OUTER JOIN usermeta AS meta ON m.id = meta.id 
WHERE m.zipcode = p.zipcode AND COALESCE(meta.meta_key,'image')='image' AND m.country = 'USA' 
+0

謝謝!更好,但仍然不正確! :-(我得到大約218行313. – Helge 2010-12-13 02:43:57

+0

不正確?哪些行被排除?嘗試合併where子句中的所有列: WHERE COALESCE(meta.meta_key,'image')='image'AND COALESCE m.country,'USA')='USA'(注意我刪除了m.zipcode = p.zipcode,因爲已經寫在ON子句中) – YudhiWidyatama 2010-12-13 02:48:38

+0

在改變之後輸出相同!它可能與此有關,並非所有用戶都有一個與meta.id相對應的m.id?某些用戶只存在於成員表中,但他們沒有這種特定類型的ID,如果他們沒有member.id,那麼他們也不會有一個meta.id. – Helge 2010-12-13 03:01:32

1

您正在使用INNER JOIN;使用OUTER JOINS從條件爲false的連接表的列中獲取NULL值。

例如:

SELECT m.name, m.zipcode, p.lat, p.lon, meta.meta_value 
FROM members AS m 
LEFT OUTER JOIN zipcodes AS p ON m.zipcode = p.zipcode 
LEFT OUTER JOIN usermeta AS meta ON m.id = meta.id 
WHERE m.zipcode = p.zipcode AND meta.meta_key = 'image' m.country = "USA" 
+0

感謝胡里奧,但是這給了完全相同的輸出上面的查詢! – Helge 2010-12-13 02:46:51

+0

@Helge我知道,但現在你有NULL值,所以你可以「玩」與你的WHERE條件表達式來獲取你的數據,例如'A IN(possible_val1,possible_val2,...,NULL)' – 2010-12-13 05:53:00