2012-04-12 115 views
19

如果我有WHERE子句前INNER JOIN

SELECT * FROM Table1 t1 
LEFT JOIN Table2 t1 ON t1.id = t2.id 
WHERE t1.user='bob'; 

是否WHERE条款运行之后的两个表是JOINED

如何使它在JOIN之前运行?

+0

给出的答案是正确的,但值得深入研究。你为什么在寻找这种行为?我可以想象查询优化器会为您处理明显的情况... – 2012-04-12 23:47:22

回答

19

更改WHERE另一个JOIN条件

LEFT JOIN Table2 t2 on t1.id = t2.id AND t1.user='bob'

0

你可以做以前join所以它不会加入不必要的记录

SELECT * 
    FROM Table1 t1 
    LEFT JOIN Table2 t2 
     ON t1.id=t2.id AND t1.user='bob'; 
55

where条款将被执行。所以你的代码很好。

+4

其他人可以确认吗? – user1124535 2012-04-12 23:59:25

+3

@ user1124535我可以确认。运行'explain'查询,你会看到。 – 2012-04-13 04:04:08

+2

这应该会得到更多的赞扬 – 2015-03-11 11:45:10

0

根据我的左连接经验,您无法在ON语句的'left'(t1)表中排除记录,因为根据定义,所有t1记录都将包含在内。 where语句确实起作用,因为它将应用于之后的连接结果。

我不完全知道你想达到什么,但很可能是一个内部联接适合你的需求,然后你可以添加t1.user ='bob'条件的ON语句。

但是,如果Mosty Mostacho是正确的,条件的位置(WHERE VS ON)与执行速度无关。

0

右连接是解决办法:

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 

还没有把它通过充分严酷还,但似乎工作。