Если у меня есть
SELECT * FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.id = t2.id
WHERE t1.user='bob';
Ли WHERE
является условие запуска после двух таблиц JOINED
?
Как мне сделать так, чтобы он работал до JOIN?
Если у меня есть
SELECT * FROM Table1 t1
LEFT JOIN Table2 t2 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'
Предложение where
будет выполнено до join
, чтобы оно не включало ненужные записи. Таким образом, ваш код в порядке, как есть.
В моем опыте в левом соединении вы не можете исключать записи в таблице "left" (t1) в ON-statement, поскольку - по определению - все записи t1 будут включены. Оператор where работает, поскольку он будет применен к результату объединения впоследствии.
Я точно не знаю, чего вы хотите достичь, но, скорее всего, внутреннее соединение подходит и вашим потребностям, а затем вы можете добавить условие t1.user = 'bob' к оператору ON.
Но если Мосты Мостачо верен, местоположение (WHERE vs ON) условия не имеет отношения к скорости выполнения.
вы можете сделать
SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.id=t2.id AND t1.user='bob';
RIGHT JOIN было решением:
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
Пока еще не испытал все это, но, похоже, работает.
Вы должны просто добавить t1.user='bob'
в предложение ON
перед другим условием, и оно будет оценено в первую очередь:
SELECT * FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.user='bob' AND t1.id = t2.id;
То, что вы можете использовать, является табличным выражением после FROM следующим образом:
SELECT *
FROM (SELECT
id
FROM Table1
WHERE user = 'bob') AS t1
LEFT JOIN Table2 t2
ON t1.id = t2.id