SELECT * FROM Table1 t1
LEFT JOIN Table2 t1 ON t1.id = t2.id
WHERE t1.user='bob';
是否WHERE
條款運行之後的兩個表是JOINED
?
如何使它在JOIN之前運行?
SELECT * FROM Table1 t1
LEFT JOIN Table2 t1 ON t1.id = t2.id
WHERE t1.user='bob';
是否WHERE
條款運行之後的兩個表是JOINED
?
如何使它在JOIN之前運行?
更改WHERE
另一個JOIN
條件
LEFT JOIN Table2 t2 on t1.id = t2.id AND t1.user='bob'
你可以做以前join
所以它不會加入不必要的記錄
SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.id=t2.id AND t1.user='bob';
的where
條款將被執行。所以你的代碼很好。
其他人可以確認嗎? – user1124535 2012-04-12 23:59:25
@ user1124535我可以確認。運行'explain'查詢,你會看到。 – 2012-04-13 04:04:08
這應該會得到更多的讚揚 – 2015-03-11 11:45:10
根據我的左連接經驗,您無法在ON語句的'left'(t1)表中排除記錄,因爲根據定義,所有t1記錄都將包含在內。 where語句確實起作用,因爲它將應用於之後的連接結果。
我不完全知道你想達到什麼,但很可能是一個內部聯接適合你的需求,然後你可以添加t1.user ='bob'條件的ON語句。
但是,如果Mosty Mostacho是正確的,條件的位置(WHERE VS 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
還沒有把它通過充分嚴酷還,但似乎工作。
給出的答案是正確的,但值得深入研究。你爲什麼在尋找這種行爲?我可以想象查詢優化器會爲您處理明顯的情況... – 2012-04-12 23:47:22