Vinzenz Mai: Problem mit MySql 5 und left outer join

Beitrag lesen

Hallo

Ich hab da ein Statement, dass in MySql 4.1 läuft und in 5.0.15 nicht mehr.

Das spricht für MySQL 5 :-)

  

> select blabla  
> from tab1, tab2  
> LEFT OUTER JOIN tab3 kz ON lh_tab3.feldid = tab1.feldid  
  
/* auf lh_ hat Ilja Dich bereits aufmerksam gemacht. */  
  

> where tab1.feldid = tab2.feldid

Fehler: 1054 - Unknown column 'tab1.feldid' in 'on clause'
(das feld ist aber vorhanden ;))

Aber nicht in Tabelle tab2!

lustig ist noch, dass wenn ich beim from tab1 mit tab2 vertausche (from tab2, tab1), dass es dann funzt.

Nö, nicht lustig, sondern zu erwarten. Du hast keine Klammern gesetzt, infolgedessen werden die Joins von links nach rechts abgearbeitet, siehe MySQL-Handbuch.

Du hast also einen CROSS JOIN (auch wenn es über die WHERE-Bedingung ein INNER JOIN ist) zwischen tab1 und tab2 und einen LEFT OUTER JOIN zwischen _tab2_ und tab3. Du hast nicht, wie Du erwartest, einen LEFT OUTER JOIN zwischen tab1 und tab3. Deswegen sucht MySQL in Tabelle tab2 das Feld "tab1.feldid" und kann es dort nicht finden. Infolgedessen erhältst Du eine Fehlermeldung.

Da Du eh einen INNER JOIN zwischen tab1 und tab2 hast (wenn auch versteckt), könntest Du Deine Abfrage entsprechend umformulieren:

  
SELECT  
    feld1,  
    feld2,  
    ...  
FROM tab2  
INNER JOIN tab1 ON tab2.feldid = tab1.feldid  
LEFT OUTER JOIN tab3 ON tab1.feldid = tab3.feldid

oder Klammern setzen, um die Joins zu gruppieren.

hab ich ein synti-fehler,

Wenn Du einen Syntaxfehler meinst, lautet die Antwort "Ja".

oder ist das ein bug?

Wenn Du das auf Deine Anwendung beziehst, ist die Antwort: "Ja";
beziehst Du dies MySQL, dann: "Nein".

Freundliche Grüße

Vinzenz