INNER JOIN之前的WHERE子句

问题描述 投票:25回答:7

如果我有

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

WHERE子句在两个表之后运行是JOINED吗?

如何使它在JOIN之前运行?

mysql join optimization where
7个回答
25
投票

WHERE改为另一个JOIN状态

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


81
投票

where子句将在join之前执行,以便它不会加入不必要的记录。所以你的代码就好了。


2
投票

根据我在左连接中的经验,您不能排除ON语句中“左”(t1)表中的记录,因为 - 根据定义 - 将包括所有t1记录。 where语句确实有效,因为它将在之后应用于连接的结果。

我不知道你想要实现什么,但很可能内部联接也适合你的需要,然后你可以将t1.user ='bob'条件添加到ON语句中。

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


0
投票

你可以做

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

0
投票

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

还没有完全严格,但似乎工作。


0
投票

您应该在其他条件之前将t1.user='bob'条件添加到ON子句,它将首先进行评估:

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

0
投票

您可以使用的是FROM之后的表表达式,如下所示:

SELECT *
FROM (SELECT
        id
    FROM Table1
    WHERE user = 'bob') AS t1
LEFT JOIN Table2 t2
    ON t1.id = t2.id
© www.soinside.com 2019 - 2024. All rights reserved.