Wenn ich habe
SELECT * FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.id = t2.id
WHERE t1.user='bob';
Läuft die WHERE
-Klausel, nachdem die beiden Tabellen JOINED
sind?
Wie mache ich es so, dass es vor dem JOIN läuft?
Ändern Sie die WHERE
in eine andere JOIN
-Bedingung
LEFT JOIN Table2 t2 on t1.id = t2.id AND t1.user='bob'
Die where
-Klausel wird vor der join
ausgeführt, damit sie keine unnötigen Datensätze verbindet. Ihr Code ist also gut, so wie er ist.
Nach meiner Erfahrung in einem Left-Join können Sie keine Datensätze in der 'left' (t1) -Tabelle in der ON-Anweisung ausschließen, da definitionsgemäß alle t1-Datensätze eingeschlossen werden. Die where-Anweisung funktioniert, da sie anschließend auf das Ergebnis des Joins angewendet wird.
Ich weiß nicht genau, was Sie erreichen möchten, aber höchstwahrscheinlich passt auch ein innerer Join zu Ihren Bedürfnissen, und dann können Sie can die ON-Anweisung mit der Bedingung t1.user = 'bob' versehen.
Wenn jedoch Mosty Mostacho korrekt ist, ist der Ort (WHERE vs. ON) der Bedingung für die Ausführungsgeschwindigkeit nicht relevant.
RIGHT JOIN war die Lösung:
SELECT cars.manufacturer, cars.year FROM cars
RIGHT JOIN (SELECT m.manufacturer FROM cars AS m ORDER BY m.year DESC LIMIT 3) subq
ON cars.manufacturer=subq.manufacturer
Ich habe es noch nicht durchgemacht, scheint aber zu funktionieren.
Was Sie verwenden können, ist ein Tabellenausdruck nach FROM wie folgt:
SELECT *
FROM (SELECT
id
FROM Table1
WHERE user = 'bob') AS t1
LEFT JOIN Table2 t2
ON t1.id = t2.id
du kannst tun
SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.id=t2.id AND t1.user='bob';
Sie sollten nur die t1.user='bob'
-Bedingung vor der anderen Bedingung zur ON
-Klausel hinzufügen. Diese wird zuerst ausgewertet:
SELECT * FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.user='bob' AND t1.id = t2.id;