2010-04-23 52 views
10

我有這個疑問:左連接不返回在MySQL中的所有行

SELECT pr.*, pr7.value AS `room_price_high` 
FROM `jos_hp_properties` pr 
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id 
WHERE pr7.field=23 

jos_hp_properties表有27行,但查詢只返回一個。基於this question我認爲這可能是因爲WHERE子句。該jos_hp_properties2表有ID字段,屬性,字段值,其中field是一個外鍵,第三個表(我並不需要從獲得的數據)。

有沒有辦法選擇所有從第一個表中的行,包括表#2,其中場是23(或NULL如果沒有字段23)的價值?

回答

27

肯定。移動WHERE條件的JOIN:

SELECT pr.*, pr7.value AS `room_price_high` 
    FROM `jos_hp_properties` pr 
     LEFT JOIN `jos_hp_properties2` pr7 
     ON pr7.property=pr.id 
    AND 
     pr7.field=23 
+0

謝謝!在我掛這個問題的答案其實解釋這一點,但由於某些原因,它沒有任何意義,我第一次讀它... – DisgruntledGoat 2010-04-23 17:06:47

+0

感謝伯尼您的解決方案救了我的命 – Devjosh 2012-05-18 11:17:04

+0

你是最歡迎的。 – bernie 2014-02-27 05:33:37

0

試試這個:

SELECT pr.*, pr7.value AS `room_price_high` 
FROM `jos_hp_properties` pr 
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id 
WHERE (pr7.field=23 OR pr7.field is null) 
+0

這是不太最優查詢 - 看看那裏的PR7標準被移動到加入其他的答案。 – 2010-04-23 16:50:59

+0

是的,我看到當我打字時應該改變它,但我感到很懶惰。這個問題讓我想起了所有專門排除行的程序員,然後期望他們神奇地重新出現,因爲他們說「外連接」。 – MJB 2010-04-23 17:50:23

6

您必須將PR7標準的加入,where子句不在家。在執行連接之後,where子句適用於整個結果集。

SELECT pr.*, pr7.value AS `room_price_high` 
FROM `jos_hp_properties` pr 
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id and pr7.field=23