2010-04-23 10 views
10

mam tego zapytania w MySQL:LEFT JOIN nie wraca wszystkie wiersze

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 

tabela jos_hp_properties ma 27 rzędów, ale kwerenda zwraca tylko jeden. Na podstawie this question myślę, że może to być spowodowane klauzulą ​​WHERE. Tabela jos_hp_properties2 zawiera identyfikator pola, właściwość, pole, wartość, gdzie field jest obcym kluczem do trzeciej tabeli (z której nie muszę pobierać danych).

Czy istnieje sposób, aby wybrać wszystkie wiersze z pierwszej tabeli, w tym wartość z tabeli nr 2, gdzie pole wynosi 23 (lub NULL, jeśli nie ma pola 23)?

Odpowiedz

27

Pewnie. Przenieś warunek WHERE do 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

Dzięki! Odpowiedź w pytaniu, które łączyłem, wyjaśnia to, ale z jakiegoś powodu nie było to sensowne po raz pierwszy przeczytałem ... – DisgruntledGoat

+0

dzięki Bernie rozwiązanie uratowało mi życie – Devjosh

+0

Bardzo miło. – bernie

0

Spróbuj tego:

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

To nie jest optymalne zapytanie - zobacz inne odpowiedzi, w których kryteria pr7 są przenoszone do łączenia. –

+0

Tak, widziałem to, kiedy pisałem i powinienem to zmienić, ale czułem się leniwy. To pytanie przypomina mi wszystkich programistów, którzy wyraźnie wykluczają wiersze i oczekują od nich ponownego pojawienia się magii, ponieważ powiedzieli "zewnętrzne sprzężenie". – MJB

6

należy umieścić kryteria PR7 w sprzężeniu, a nie w klauzuli WHERE. Klauzula where działa na całym zestawie wyników PO zakończeniu łączenia.

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