Daniel Petratsch: Mysql Mehrere Joins in einem Statement, welche Reihenfolge ?

Hallo!

Mir wäre sehr geholfen, wenn mir jemand einen Tipp geben könnte wie die Joins eigentlich abgearbeitet werden, solbald mehrere in einem Statement vorkommen. Ich habe folgende Mysql Abfrage:

--------------------------------------->

SELECT a.artikel_nr,a.ueberschrift,a.kurzbeschreibung,a.verkaufspreis,a.aktionspreis,a.in_aktion,a.verkaufseinheit, a.lieferzeit,a.ordersatz,b.vorschau,b.dateiname,c.firmenname,c.plz,c.ort
FROM
artikel AS a
LEFT JOIN artikelbilder AS b
ON (a.artikel_nr = b.artnr_intern)
INNER JOIN lieferantendaten AS c
ON (a.ordersatz = c.ordersatz)
WHERE (a.kategorie = 25) AND (b.vorschau = 1)
ORDER BY a.ueberschrift ASC

--------------------------------------->

Also nun muss ich natürlich noch dazu sagen, wass ich eigentlich erreichen will:

Ich habe 3 Tabellen, in der 1. sind Artikel gespeichert, in der 2. sind die zugehörigen Bildnamen und in der letzten die zugehörigen Lieferanten. Da ich nun alle Informationen brauche ist das meines Denkens nach am performantesten, wenn ich es in einer einzigen Abfrage mache. Soweit sogut - funktioniert auch ganz prima - aber nur dann wenn auch in der Bilddatenbank ein Eintrag zum Artikel mit der dementsprechenden Artikelnummer (an der gejoined wird) existiert.

Nun verstehe ich aber nicht wieso das so ist, denn theoretisch müsste er zuerst die Tabelle "artikel" mit "artikelbilder" Left Joinen, existiert kein Eintrag in der "artikelbilder" Tabelle, müsste er ja mit einem NULL Feld verknüpfen. Und danach erst findet der Inner Join mit der gerade erhaltenen Tabelle und der "lieferantendaten" Tabelle statt (dieser Key besteht immer).

Es sollte halt so sein, dass wenn kein Bild zum Artikel existiert, der Datensatz trotzdem ausgelesen wird.

Habe ich die Reihenfolge denn nun falsch interpretiert oder worin liegt der Fehler?

Danke und freundliche Grüsse,
Daniel

--
Das ist der ganze Jammer, die Dummen sind immer so sicher und die Gescheiten so voller Zweifel.
[Bertrand Russell]
  1. yo,

    das ergebnis erklärt sich doch selbst. erst wird der left join ausgeführt und über dessen zwischen-ergebnis wird noch mal ein inner join gebildet und dazu müssen entsprechende datensätze auf beiden join tabellen vorhanden sein, damit es in die finale ergebnistabelle kommt. mein vorschlag, ersetze den inner join durch einen weiteren left join.

    Ilja

    1. yo,

      nachtrag: eine andere möglichkeit erst der inner join auszuführen und dann den outer join, zum besipiel indem du die reihenfolge änderst, erst den inner und dann einen right join. vielleicht geht es auch mit klammersetzung, kann ich aber nicht genau sagen out of the head.

      Ilja