SELECT
a.foo
b.bar
c.foobar
FROM tableOne AS a
INNER JOIN tableTwo AS b ON a.pk = b.fk
LEFT JOIN tableThree AS c ON b.pk = c.fk
WHERE a.foo = \'something\'
AND c.foo
1st case (where the c.foobar is in the where clause) the filtering by the c.foobar happens after the joins have occured (they occur correctly), so you effectively filter-out all resulting records that do not have a 'somethingelse' in there..
2nd case the c.foobar is part of the join, so it evaluates at joining time and just controls the output of the join, and not the final recordset (returnsnull where the join fails)..
It's because of your WHERE clause.
Whenever you specify a value from the right side of a left join in a WHERE clause (which is NOT NULL), you necessarily eliminate all of the NULL values and it essentially becomes an INNER JOIN.
If you write, AND (c.foobar = 'somethingelse' OR c.foobar IS NULL) that will solve the problem.
You can also move the c.foobar portion into your join predicate, and that too will solve the issue.