LEFT JOINとWHERE文の例

LEFT JOINで左側のテーブルのデータは全部欲しい時に、右側のテーブルの条件をWHERE文で指定したら、右側と関連のない(右.id = 左.id にならない)左側テーブルのデータが出てこなくなった。

たとえば右側にテーブル<term>があるとする。

tid name
1 Apple
2 Orange
3 Grape
4 Melon
5 Pineapple
6 Blueberry
select p.uid, t.tid, t.name FROM term t LEFT JOIN user_record p ON t.tid = p.tid  WHERE t.tid != 1 and p.uid =5 group by t.name;

期待していたのはこんな結果だったが、

p.uid tid name
5 1 Apple
Null 2 Orange
Null 3 Grape
5 4 Melon
Null 5 Pineapple
5 6 Blueberry

実際にはこんな結果になった。

p.uid tid name
5 1 Apple
5 4 Melon
5 6 Blueberry

このクエリの中の、p.uid = 5の部分の位置によって結果が変わってくる。これがJOIN文の中に入っている場合は、この条件よりもLEFTテーブル全体の結果を出すということが優先される。この条件がクエリ全体にかかるWHERE文に入っている場合は、最終的な結果がこの条件によってフィルタされるので、左テーブル全体の結果もフィルタされてしまう。
そこで、今回必要だったクエリはこんな感じ。

select p.uid, t.tid, t.name FROM term t LEFT JOIN user_record p ON t.tid = p.tid and p.uid = 5 WHERE t.tid != 1 group by t.name;