2010-04-23 17 views
10

Rückkehr ich diese Abfrage in MySQL haben:LEFT JOIN nicht alle Zeilen

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 

Die jos_hp_properties Tabelle hat 27 Zeilen, aber die Abfrage gibt nur einen. Basierend auf this question Ich denke, dass es wegen der WHERE-Klausel sein kann. Die Tabelle jos_hp_properties2 hat Felder ID, Eigenschaft, Feld, Wert, wobei field ein Fremdschlüssel für eine dritte Tabelle ist (zu der ich keine Daten abrufen muss).

Gibt es eine Möglichkeit, alle Zeilen aus der ersten Tabelle auszuwählen, einschließlich des Werts aus Tabelle 2, wobei das Feld 23 ist (oder NULL, wenn kein Feld 23 vorhanden ist)?

Antwort

27

Sicher. Bewegen Sie die WHERE-Bedingung an die 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

Vielen Dank! Die Antwort in der Frage, die ich verknüpfte, erklärt dies tatsächlich, aber aus irgendeinem Grund machte es keinen Sinn, wenn ich es zum ersten Mal las ... – DisgruntledGoat

+0

danke bernie Deine Lösung rettete mein Leben – Devjosh

+0

Du bist herzlich willkommen. – bernie

0

Try this:

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

Dies ist nicht die optimale Abfrage - siehe die anderen Antworten, bei denen die pr7-Kriterien in den Join verschoben werden. –

+0

Ja, ich sah das, als ich es tippte und hätte es ändern sollen, aber ich fühlte mich faul. Diese Frage erinnert mich an alle Programmierer, die Zeilen explizit ausschließen und dann erwarten, dass sie auf magische Weise wieder erscheinen, weil sie "Outer Join" sagten. – MJB

6

Sie müssen die pr7 Kriterien in der Verknüpfung platzieren, nicht in der where-Klausel. Die WHERE-Klausel wirkt auf die gesamte Ergebnismenge, NACHDEM die Verknüpfung ausgeführt wurde.

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