MySQL Fehler

G.P.

Legendäres Mitglied
Ich ahbe gerade eine Denkblockade

Ich habe eine SQL Abfarge, in welche ich eine zusätzliche Tabelle einbinden will, die aber nicht immer Werte enthält.
Also habe ich noch ein Left Join eingebunden.

Merkwürdigerweise geht es aber danach nicht mehr. Ohne die LEFT JOIN Abfarge klappt aber alles richtig.
Hat jemand eien Idee wo mein Fehler liegen könnte?

CODE SELECT wa.*, wp.test, al.test2, waf.test3
FROM tabel1 wa, tabel2 wp, tabel3 al
LEFT JOIN tabel4 waf
ON wa.id = waf.id
WHERE wa.id = wp.id
AND wp.id2 = al.id
AND wa.value > 0


Danke
 
Ich nehme an Du hast MySQL 5. Dort muss man die eingebundenen Tabellen Klammern um einen JOIN machen zu können (geht btw. auch bei MySQL 4, dort ist es aber keine Pflicht).

CODE SELECT wa.*, wp.test, al.test2, waf.test3
FROM (tabel1 wa, tabel2 wp, tabel3 al)
LEFT JOIN tabel4 waf
ON wa.id = waf.id
WHERE wa.id = wp.id
AND wp.id2 = al.id
AND wa.value > 0
 
Das ist ja mal eine schön einfache Lösung.
Danke
biggrin.gif
 
Irgendwie stimmt mir da die Struktur nicht. Mal konsistent umformulieren:

CODE SELECT wa.*, wp.test, al.test2, waf.test3
FROM tabel1 As wa Inner Join tabel2 As wp
On wa.id = wp.id Inner Join tabel3 As al
On wp.id2 = al.id Left Join tabel4 As waf
On wa.id = waf.id

Where wa.value > 0



So ganz sehe ich noch nicht, wo der Fehler bzw. das Problem liegen könnte.

Grundsätzlich nutze ich kommagetrennte Tabellen nur in sehr seltenen Ausnahmefällen. Denn wenn eine Tabelle leer ist, kommen auch sofort keine Zeilen mehr beim Gesamtausdruck raus.

Bei Left Joins muß man grundsätzlich aufpassen (das war meine erste Vermutung, die sich nach der Zerlegung aber nicht bestätigte), daß man nicht ein Where-Kriterium für die per Left Join eingebundene Tabelle fordert. Denn ein Where-Kriterium heißt immer <> Null in der Vergleichsspalte, also wird aus dem Left Join effektiv ein Inner Join.

Wenn man eine Tabelle per Left Join einbinden und für diese ein Where-Kriterium formulieren will, muß man entweder den Null-Fall gesondert in der Where-Bedingung abhandeln oder eine Unterabfrage draus machen, die per Left Join eingebunden wird.

Vermutlich muß man einen oder mehrere der obigen Join-Verknüpfungen ebenfalls zu LeftJoin-Ausdrücken ändern.

Und aus Konsistenzgründen arbeite ich inzwischen meist mit standardisierten Alias-Namen. Bsp.:


CODE SELECT A1.*, A2.test, A3.test2, A4.test3
FROM tabel1 As A1 Inner Join tabel2 As A2
On A1.id = A2.id Inner Join tabel3 As A3
On A2.id2 = A3.id Left Join tabel4 As A4
On A1.id = A4f.id

Where A1.value > 0


Dann sieht man, wo was herkommt.

 
Zurück
Oben