私が持っている場合
SELECT * FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.id = t2.id
WHERE t1.user='bob';
WHERE
句は、2つのテーブルがJOINED
の後に実行されますか?
JOINの前に実行されるようにするにはどうすればよいですか?
WHERE
を別のJOIN
条件に変更する
LEFT JOIN Table2 t2 on t1.id = t2.id AND t1.user='bob'
where
句はjoin
の前に実行され、不要なレコードを結合しないようにします。だからあなたのコードはそれがそうである方法で結構です。
左結合での私の経験では、定義上、すべてのt1レコードが含まれるため、ONステートメントの「左」(t1)テーブルのレコードを除外することはできません。 whereステートメントは、後で結合の結果に適用されるため、機能します。
私はあなたが何を達成したいのか正確にはわかりませんが、おそらく内部結合もあなたのニーズに合い、それからあなたはcan t1.user = 'bob'条件をONステートメントに追加します。
しかし、Mosty Mostachoが正しい場合、条件の場所(WHERE対ON)は実行速度に関係ありません。
正しい結合が解決策でした:
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
まだ完全な厳密さを通過していませんが、機能しているようです。
使用できるのは、次のようなFROMの後のテーブル式です。
SELECT *
FROM (SELECT
id
FROM Table1
WHERE user = 'bob') AS t1
LEFT JOIN Table2 t2
ON t1.id = t2.id
できるよ
SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.id=t2.id AND t1.user='bob';
他の条件の前にt1.user='bob'
条件をON
句に追加するだけで、最初に評価されます。
SELECT * FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.user='bob' AND t1.id = t2.id;