MySQLで LEFT JOIN でサブクエリが必要な場面とSQL例

MySQLでのテーブル結合に LEFT JOIN  を使う時・・・

条件で絞り込んだり、並び替えたのを結合したい場面ってありますよね?

そういう場合だと、サブクエリ を使う必要が出てきます。

そこで MySQL において、
サブクエリによる LEFT JOIN がいる場面とか実際のコード例をまとめました。

サブクエリという概念を知っていると、難しいことも簡単になります。

まず LEFT JOIN について簡単におさらい

まあ説明不要かもですか念のため

その名の通り、 LEFT JOIN  は左側からテーブル結合するための命令です。

複雑な操作をしたいときは結構よく使います。

 

例えば次みたいなテーブルとデータを用意したとしましょう。

ここでは仮のテーブルとして、

  • ゲームのプレイヤーを記録する 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 を結合先のテーブルに対して使えばいい訳です

これが一般的な 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

この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 でサブクエリが必要な場面&コード例でした。ではでは

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください