INNER JOIN之前的WHERE子句

时间:2012-04-12 23:39:35

标签: mysql join optimization where

如果我有

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

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

如何在JOIN之前运行它?

7 个答案:

答案 0 :(得分:78)

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

答案 1 :(得分:24)

WHERE更改为另一个JOIN条件

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

你可以做到

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

答案 4 :(得分: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

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

答案 5 :(得分:0)

您应该只将x-session-id:\s+(.+)条件添加到t1.user='bob'子句中,然后再附加其他条件,它将首先被评估:

ON

答案 6 :(得分:0)

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

<?php


$postData = array(
'name' => 'postmanole',
'password' => 'password'
);


$ch = curl_init();

curl_setopt_array($ch, array(
CURLOPT_URL => 'http://a.localhost/login',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
));


$output = curl_exec($ch);

echo $output;

?>