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;