Moin!
Sorry, aber ich bin mir sicher, dass ich deine Aufgabe noch nicht ganz verstanden habe.
Deshalb wohl auch der Threadtitel.SELECT a2.name, a2.data, d.type, d.id FROM a LEFT JOIN a AS a2 ON a.id=a2.id AND
a.name="username" AND a.data ="ckruse" LEFT JOIN d ON a.id=d.idDas ist dasselbe in gruen. Du hast nur die Tabellen anders angeordnet. Du bildest ein
karthesisches Produkt und filterst das mit WHERE.
Nein, mache ich nicht. Das ist ja gerade der Trick mit dem ON-Statement: Es wird nicht das Kreuzprodukt (jede Zeile der einen Tabelle wird mit jeder anderen Zeile der anderen Tabelle verknüpft und dann rausgefiltert, was gewünscht ist) gebildet, sondern es werden nur die Verknüpfungen in die Ergebnistabelle gelegt, die der ON-Bedingung (geprüft vor der Verknüpfung) entsprechen.
Siehe auch http://www.little-idiot.de/mysql/mysql-118.html:
"Der einfachste JOIN ist der sogenannte "EQUI-JOIN". Ein Beispiel :
SELECT A.EineSpalte, B.EineAndereSpalte
FROM Tabelle1 AS A, Tabelle2 AS B WHERE A.EinWert = B.EinAndererWert;
Man kann ihn aber auch ganz anders schreiben, und die Ergebnismenge wird die gleiche sein, nämlich so :
SELECT A.EineSpalte, B.EineAndereSpalte
FROM Tabelle1 AS A JOIN Tabelle2 AS B
ON A.EinWert = B.EinAndererWert;
Wenn die Ergebnismenge die gleiche ist, wo liegt dann der Unterschied zwischen diesen beiden Formen ? Gibt es überhaupt einen Unterschied ?
Der Unterschied liegt in der Laufzeit. Im ersten Beispiel wird zuerst das kartesische Produkt aus beiden Tabellen gebildet (jede Zeile aus Tabelle1 wird mit jeder Zeile aus Tabelle2 verknüpft), und wenn beide Tabellen nur jeweils 100 Zeilen enthalten, sind das schon 10.000 Zeilen in der temporären Zwischentabelle. Erst dann werden die Zeilen gelöscht, die nicht die WHERE-Bedingung erfüllen."
Scheint mir jedenfalls wesentlich besser zu sein, als mit WHERE zu arbeiten. Die MySQL-Doku (http://www.mysql.com/documentation/mysql/bychapter/manual_MySQL_Optimisation.html#LEFT_JOIN_optimisation) sagt zu den Optimierungen, die bei LEFT JOIN vorgenommen werden, allerdings, dass ON und WHERE gleich behandelt werden (alles in ON wird nach WHERE befördert und optimiert). Ich kann mir dann nicht vorstellen, dass MySQL sowas aufwendiges wie ein vollständiges kartesisches Produkt im Speicher anlegt, um mit WHERE Zeilen rauszufiltern, sondern die ganze Sache von vornherein optimiert.
Wenn du auf MySQL angewiesen bist, bleibt dir also nichts anderes übrig, als zu nehmen, was möglich ist. Man kann sicherlich mit der Tabellenreihenfolge noch experimentieren (da gibts offenbar laut MySQL Unterschiede, man kann Full Table Scans vermeiden helfen), aber um das JOINen kommst du nicht drum herum.
- Sven Rautenberg