
WPホームページ研究所運営サポートチーム監修のオムスビ(@OMUSUVIcom)です。
データベース設計では「テーブルを複数に分ける」のが基本です。たとえばメインのテーブルと関連するデータはサブのテーブルにしてメインテーブル側が持つidと紐づけることで整理しておきます。
SQLでは「異なるテーブルのデータをくっつけて呼び出す(INNER JOIN/OUTER JOIN)こともできる」のでテーブルをしっかりと適切に管理できる構造にしておけばデータ取得で困りません。
【SQLite】INNER JOINで複数のテーブルを1つにまとめる書き方
取得には「INNER JOIN(内部結合)」と「OUTER JOIN(外部結合)」を使います。
内部結合と外部結合の違い
内部結合は「両方のテーブルに存在する合体可能なデータを絞り込む方法」。そして外部結合が「基準にするテーブル側にさえデータがあれば片方のテーブルに存在しなくても合体させる方法」です。
処理の軽さで言えば「内部結合」に軍配。集計など総数をカウントする場合は外部結合が便利かもしれません。本記事で使用するサンプルデータは以下の手順で作っています。
念のために書き出すと「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が使えます。なかには書き方が少しだけ違う場合やそもそも使えない機能もあったりしますので詳しくは色々なパターンで試すのがおすすめです。
ぜひご参照くださいませ。
最新式の無料プラグインを事前公開
WordPressは公式サイトに登録済みのプラグインだけで全機能を補足しきれません。当サイトでは使いやすさを追求した魅惑的なプラグインを無料でダウンロードいただけます。運営ホームページのマーケティング力をさらに高めるチャンスです。まずは無料でDLしてお試しくださいませ。
→ 改良されたプラグインを確認する