43

If I have

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

Does the WHERE clause run after the two tables are JOINED?

How do I make it so it runs prior to the JOIN?

double-beep
  • 4,567
  • 13
  • 30
  • 40
user1124535
  • 685
  • 3
  • 9
  • 15
  • The answers given are correct, but it's worth delving a little deeper. Why are you looking for this behavior? I'd imagine the query optimizer would handle the obvious case for you... – Dan J Apr 12 '12 at 23:47

7 Answers7

114

The where clause will be executed before the join so that it doesn't join unnecessary records. So your code is fine the way it is.

Mosty Mostacho
  • 41,294
  • 14
  • 93
  • 121
33

Change the WHERE to another JOIN condition

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

hkf
  • 4,312
  • 1
  • 28
  • 44
2

In my experience in a left join you cannot exclude records in the 'left' (t1) table in the ON-statement since - by definition - all t1 records will be included. The where statement does work as it will be applied to the result of the join afterwards.

I do not exactly know what you want to achieve but most probably an inner join suits your needs as well and then you can add the t1.user='bob' condition to the ON-statement.

But if Mosty Mostacho is correct, the location (WHERE vs ON) of the condition is not relevant for speed of execution.

tihe
  • 2,322
  • 3
  • 24
  • 27
1

You should just add t1.user='bob' condition to ON clause before other condition and it will be evaluated first:

SELECT * FROM Table1 t1 
LEFT JOIN Table2 t2
ON t1.user='bob' AND t1.id = t2.id;
Ivan Olshansky
  • 774
  • 1
  • 17
  • 19
1

What you may use is table expression after FROM like this:

SELECT *
FROM (SELECT
        id
    FROM Table1
    WHERE user = 'bob') AS t1
LEFT JOIN Table2 t2
    ON t1.id = t2.id
Georgi Mirchev
  • 211
  • 2
  • 5
0

you can do

SELECT * 
    FROM Table1 t1 
    LEFT JOIN Table2 t2
        ON t1.id=t2.id AND t1.user='bob';
g3rv4
  • 19,460
  • 4
  • 33
  • 58
0

RIGHT JOIN was the solution:

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

Haven't put it through the full rigors yet, but seems to work.

user2782001
  • 3,128
  • 3
  • 17
  • 36