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