【SQLite】INNER JOINで複数のテーブルを1つにまとめる書き方

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

データベース設計では「テーブルを複数に分ける」のが基本です。たとえばメインのテーブルと関連するデータはサブのテーブルにしてメインテーブル側が持つidと紐づけることで整理しておきます。

SQLでは「異なるテーブルのデータをくっつけて呼び出す(INNER JOIN/OUTER JOIN)こともできる」のでテーブルをしっかりと適切に管理できる構造にしておけばデータ取得で困りません。

【SQLite】INNER JOINで複数のテーブルを1つにまとめる書き方

取得には「INNER JOIN(内部結合)」と「OUTER JOIN(外部結合)」を使います。

内部結合と外部結合の違い

内部結合は「両方のテーブルに存在する合体可能なデータを絞り込む方法」。そして外部結合が「基準にするテーブル側にさえデータがあれば片方のテーブルに存在しなくても合体させる方法」です。

処理の軽さで言えば「内部結合」に軍配。集計など総数をカウントする場合は外部結合が便利かもしれません。本記事で使用するサンプルデータは以下の手順で作っています。

【SQLite】サンプルデータを作るためのSQL文

念のために書き出すと「staffテーブル」が以下です。

id name job_id
1 Yamada 3
2 Kitano 3
3 Suzuki 1
4 Minami 1
5 Yabuki 1

そして「jobテーブル」が下記。

id name
1 Programmer
2 Writer
3 Designer

現状では「2(Writer)」の職種に該当するスタッフが一人も存在していません。

実際に内部結合でSQLを呼び出す例

データベースの読込みから出力までは以下にて行っています。

// データベースを作成する(すでにあれば読込み)
$db = new SQLite3('/home/example.com/db/SQLite/CompanyData.db');

// 実行するためのSQLを格納する
$sql = 'SELECT * FROM table1 INNER JOIN table2 ON table1.field1 = table2.field2';

// SQLクエリを実行する
$res = $db->query($sql);

// 実行結果を出力する
while( $row = $res->fetchArray() ) {
	echo '<pre>';
	var_dump($row);
	echo '</pre>';
}

SQLは本記事のテーブルに合わせて以下に変更。

SELECT * FROM staff INNER JOIN job ON staff.job_id = job.id;

すると以下が出力されました。名前をベースに配列データが取得できていますね。

array(8) {
  [0]        => int(1)
  ["id"]     => int(3)
  [1]        => string(6) "Yamada"
  ["name"]   => string(8) "Designer"
  [2]        => int(3)
  ["job_id"] => int(3)
  [3]        => int(3)
  [4]        => string(8) "Designer"
}
array(8) {
  [0]        => int(2)
  ["id"]     => int(3)
  [1]        => string(6) "Kitano"
  ["name"]   => string(8) "Designer"
  [2]        => int(3)
  ["job_id"] => int(3)
  [3]        => int(3)
  [4]        => string(8) "Designer"
}
array(8) {
  [0]        => int(3)
  ["id"]     => int(1)
  [1]        => string(6) "Suzuki"
  ["name"]   => string(10) "Programmer"
  [2]        => int(1)
  ["job_id"] => int(1)
  [3]        => int(1)
  [4]        => string(10) "Programmer"
}
array(8) {
  [0]        => int(4)
  ["id"]     => int(1)
  [1]        => string(6) "Minami"
  ["name"]   => string(10) "Programmer"
  [2]        => int(1)
  ["job_id"] => int(1)
  [3]        => int(1)
  [4]        => string(10) "Programmer"
}
array(8) {
  [0]        => int(5)
  ["id"]     => int(1)
  [1]        => string(6) "Yabuki"
  ["name"]   => string(10) "Programmer"
  [2]        => int(1)
  ["job_id"] => int(1)
  [3]        => int(1)
  [4]        => string(10) "Programmer"
}

次はjobテーブルをメインで書いたパターンです。

SELECT * FROM job INNER JOIN staff ON job.id = staff.job_id;

jobが優先的に出力されていますね。

array(8) {
  [0]        => int(1)
  ["id"]     => int(3)
  [1]        => string(10) "Programmer"
  ["name"]   => string(6) "Suzuki"
  [2]        => int(3)
  [3]        => string(6) "Suzuki"
  [4]        => int(1)
  ["job_id"] => int(1)
}
array(8) {
  [0]        => int(1)
  ["id"]     => int(4)
  [1]        => string(10) "Programmer"
  ["name"]   => string(6) "Minami"
  [2]        => int(4)
  [3]        => string(6) "Minami"
  [4]        => int(1)
  ["job_id"] => int(1)
}
array(8) {
  [0]        => int(1)
  ["id"]     => int(5)
  [1]        => string(10) "Programmer"
  ["name"]   => string(6) "Yabuki"
  [2]        => int(5)
  [3]        => string(6) "Yabuki"
  [4]        => int(1)
  ["job_id"] => int(1)
}
array(8) {
  [0]        => int(3)
  ["id"]     => int(1)
  [1]        => string(8) "Designer"
  ["name"]   => string(6) "Yamada"
  [2]        => int(1)
  [3]        => string(6) "Yamada"
  [4]        => int(3)
  ["job_id"] => int(3)
}
array(8) {
  [0]        => int(3)
  ["id"]     => int(2)
  [1]        => string(8) "Designer"
  ["name"]   => string(6) "Kitano"
  [2]        => int(2)
  [3]        => string(6) "Kitano"
  [4]        => int(3)
  ["job_id"] => int(3)
}

配列で同時に値が取得できればあとは任意の場所へ出力する処理を書くだけでOKです。

まとめ

本日は「INNER JOIN(内部結合)の使い方」を解説させていただきました。

SQLiteもMySQLも基本的には同じ構文のSQLが使えます。なかには書き方が少しだけ違う場合やそもそも使えない機能もあったりしますので詳しくは色々なパターンで試すのがおすすめです。

ぜひご参照くださいませ。

【今すぐ無料プラグインを手に入れる】
無料ダウンロードはこちら

ワードプレス専門家に丸投げする

WPホームページ研究所はワードプレスを中心としたブログ作成・ホームページ制作・オウンドメディア構築・プラグイン設定・調整など幅広いカスタマイズに対応しております。 記事の掲載情報はもちろんお好みの機能をいただければ専属スタッフが心を込めて対応させていただきます。まずはお気軽にお問い合わせくださいませ。

お問い合わせの種類をお選びください(もっとも近い項目)

法人の場合は法人名とご担当者のお名前をご入力ください

返信時のご連絡に利用するメールアドレスをご入力ください

運営中のウェブサイトURLがあればご入力ください

💻手に職をつけて安定的に働きたい人

⇒ 完全無料のプログラミングスクール - 受講料無料でプログラミング習得 -

お困りの内容があれば詳しい内容をお聞かせください