MySQLでのテーブル結合に LEFT JOIN を使う時・・・
条件で絞り込んだり、並び替えたのを結合したい場面ってありますよね?
そういう場合だと、サブクエリ を使う必要が出てきます。
そこで MySQL において、
サブクエリによる LEFT JOIN がいる場面とか実際のコード例をまとめました。
サブクエリという概念を知っていると、難しいことも簡単になります。
まず LEFT JOIN について簡単におさらい
まあ説明不要かもですか念のため
その名の通り、 LEFT JOIN は左側からテーブル結合するための命令です。
複雑な操作をしたいときは結構よく使います。
例えば次みたいなテーブルとデータを用意したとしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
CREATE TABLE player ( id INT KEY AUTO_INCREMENT ); CREATE TABLE locale ( id INT KEY AUTO_INCREMENT, player_id INT, code VARCHAR(255) ); INSERT INTO player (id) VALUES (1), (2), (3), (4), (5); INSERT INTO locale (player_id, code) VALUES ( 1, 'en_US' ), ( 2, 'ja_JP' ), ( 3, 'es_ES' ), ( 4, 'ja_JP' ), ( 5, 'en_US' ); |
ここでは仮のテーブルとして、
- ゲームのプレイヤーを記録する player テーブルと、
- プライヤーの言語とか国を記録する locale テーブル
この2つを作ってます。
実際に出来上がるテーブルの中身はこんな感じ
playerテーブル | localeテーブル | |
---|---|---|
player.id | locale.player_id | locale.code |
1 | 1 | en_US |
2 | 2 | ja_JP |
3 | 3 | es_ES |
4 | 4 | ja_JP |
5 | 5 | en_US |
この表みたいに、 locale テーブルは player テーブルのIDと結びついてるイメージ
そして、この2つのテーブルを "ただ単純に結合するだけ" なら、
次みたいに LEFT JOIN を結合先のテーブルに対して使えばいい訳です。
1 2 3 4 |
SELECT player.*, locale.code FROM player LEFT JOIN locale ON player.id = locale.player_id |
これが一般的な LEFT JOIN の使い方
結合先のテーブルを
LEFT JOIN に渡すということと、
その後の
ON で共通するカラムを指定するのが大事なところです。
次みたいな場合にはサブクエリが必要になる
まあ普通にテーブル結合したいなら、サブクエリなんていりません。
でも次みたいな事情があるなら、サブクエリが必須 になります。
- 結合先で条件で絞り込みしたいとき
- 結合先である列で並び替えしたいとき
- ダミーテーブルを連結したいとき
条件で絞り込みしたいとか、並び替えしたテーブルを結合したいとか・・・
あと架空のテーブルを結合したときも必要かも
サブクエリを LEFT JOIN で結合する方法&コード例
という訳で、 LEFT JOIN からサブクエリを結合する方法を紹介します。
今回例に使うのは、先ほど例に出した次の2つのテーブルとデータ
playerテーブル | localeテーブル | |
---|---|---|
player.id | locale.player_id | locale.code |
1 | 1 | en_US |
2 | 2 | ja_JP |
3 | 3 | es_ES |
4 | 4 | ja_JP |
5 | 5 | en_US |
この2つを結合するとき、 locale.code の値が en_US のやつだけ結合したいとします。
そういうときは次みたいなSQLを発行してやればOK
1 2 3 4 5 6 7 8 |
SELECT locale_en.player_id, locale_en.code FROM player LEFT JOIN ( SELECT player_id, code FROM locale WHERE locale.code = 'en_US' ) AS locale_en ON player.id = locale_en.player_id WHERE locale_en.player_id IS NOT NULL; |
このSQLで大事なのは次の2つのポイント
- サブクエリに別名を付ける
この例だと locale_en という名前。名前を付けておかないと、エラーが出るので要注意!
あとサブクエリの外側でカラムを選択するためにも、名前を付けておかないとダメ - NULLチェックが必要
もし NULL 値が不要なら、 IS NOT NULL でヌルを除外する必要もアリ
この2つさえ意識しておけば、サブクエリも普通のテーブルと変わりません。
ちなみに上SQLを実行してみた結果は次の通り
locale_en.player_id | locale_en.code |
---|---|
1 | en_US |
5 | en_US |
うん、ちゃんと locale.code が en_US のカラムだけ選択できてます。
もちろん普通に LEFT JOIN するだけなら、条件絞りこみとかはできません。
でもサブクエリ内なら、絞り込みでも並び替えでもなんでもOK。
結合先テーブルが自由にカスタマイズできる、それがサブクエリの便利なとこです。
ここまでのまとめ
ここまで書いたように、
テーブル結合でサブクエリが必要になるのは次の場合
- 結合先で条件で絞り込みしたいとき
- 結合先である列で並び替えしたいとき
- ダミーテーブルを連結したいとき
普通に結合じゃダメなら、サブクエリを使うのが手っ取り早いはず
以上、MySQLの LEFT JOIN でサブクエリが必要な場面&コード例でした。ではでは