テーブルの結合
個人的にあまり理解できなかったテーブルの結合について、勉強をかねて説明して行きます。
事例
記事メディアを事例にして考えて見ます。記事データベース(media
)の中にある、2つのテーブルを結合するとします。
2つのテーブルの構成は以下の通りです。
-
article
テーブル- タイトル
- 本文
- 記事カテゴリー
No.
articleテーブル
mysql> describe article;
+-----------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(50) | YES | | NULL | |
| content | text | YES | | NULL | |
| author_category | int(11) | YES | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | |
+-----------------+-------------+------+-----+-------------------+----------------+
-
author
テーブル- 著者名
- 執筆カテゴリー
No.
authorテーブル
mysql> describe author;
+-----------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| author_category | int(11) | YES | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | |
+-----------------+-------------+------+-----+-------------------+----------------+
仮で作成したテーブルに仮のデータを挿入する
挿入文載せておきます。
articleテーブル
INSERT INTO author (name, author_category) VALUES ("佐藤太郎", 1);
INSERT INTO author (name, author_category) VALUES ("内田よしお", 2);
INSERT INTO author (name, author_category) VALUES ("岡田んだ", 3);
その結果です。
articleテーブル
mysql> SELECT * FROM article;
+----+--------------------------------+---------+-----------------+---------------------+
| id | title | content | author_category | created_at |
+----+--------------------------------+---------+-----------------+---------------------+
| 1 | ヘルスケアについて | 本文 | 1 | 2018-05-30 07:30:18 |
| 2 | スキンケアについて | 本文 | 2 | 2018-05-30 07:30:18 |
| 3 | カードローンについて | 本文 | 3 | 2018-05-30 07:30:20 |
+----+--------------------------------+---------+-----------------+---------------------+
挿入文載せておきます。
authorテーブル
INSERT INTO article (title, content, author_category) VALUES ("ヘルスケアについて","本文", 1);
INSERT INTO article (title, content, author_category) VALUES ("スキンケアについて","本文", 2);
INSERT INTO article (title, content, author_category) VALUES ("カードローンについて","本文", 3);
その結果です。
authorテーブル
mysql> SELECT * FROM author;
+----+-----------------+-----------------+---------------------+
| id | name | author_category | created_at |
+----+-----------------+-----------------+---------------------+
| 1 | 佐藤太郎 | 1 | 2018-05-30 07:25:09 |
| 2 | 内田よしお | 2 | 2018-05-30 07:25:09 |
| 3 | 岡田んだ | 3 | 2018-05-30 07:25:11 |
+----+-----------------+-----------------+---------------------+
テーブルの結合
テーブル同士は結合することができます。テーブルの結合はINNER JOIN テーブル名 ON 条件
を使用します。
多対多のテーブルの結合
具体例がわかりませんがw
例えば、著者と著書の全ての組み合わせを見たいと思った時。
mysql> SELECT * FROM author INNER JOIN article;
+----+-----------------+-----------------+---------------------+----+--------------------------------+---------+-----------------+---------------------+
| id | name | author_category | created_at | id | title | content | author_category | created_at |
+----+-----------------+-----------------+---------------------+----+--------------------------------+---------+-----------------+---------------------+
| 1 | 佐藤太郎 | 1 | 2018-05-30 07:25:09 | 1 | ヘルスケアについて | 本文 | 1 | 2018-05-30 07:30:18 |
| 2 | 内田よしお | 2 | 2018-05-30 07:25:09 | 1 | ヘルスケアについて | 本文 | 1 | 2018-05-30 07:30:18 |
| 3 | 岡田んだ | 3 | 2018-05-30 07:25:11 | 1 | ヘルスケアについて | 本文 | 1 | 2018-05-30 07:30:18 |
| 1 | 佐藤太郎 | 1 | 2018-05-30 07:25:09 | 2 | スキンケアについて | 本文 | 2 | 2018-05-30 07:30:18 |
| 2 | 内田よしお | 2 | 2018-05-30 07:25:09 | 2 | スキンケアについて | 本文 | 2 | 2018-05-30 07:30:18 |
| 3 | 岡田んだ | 3 | 2018-05-30 07:25:11 | 2 | スキンケアについて | 本文 | 2 | 2018-05-30 07:30:18 |
| 1 | 佐藤太郎 | 1 | 2018-05-30 07:25:09 | 3 | カードローンについて | 本文 | 3 | 2018-05-30 07:30:20 |
| 2 | 内田よしお | 2 | 2018-05-30 07:25:09 | 3 | カードローンについて | 本文 | 3 | 2018-05-30 07:30:20 |
| 3 | 岡田んだ | 3 | 2018-05-30 07:25:11 | 3 | カードローンについて | 本文 | 3 | 2018-05-30 07:30:20 |
+----+-----------------+-----------------+---------------------+----+--------------------------------+---------+-----------------+---------------------+
一対多のテーブルの結合
仮に、記事メディアのカテゴリーは1人の著者しかいない場合、どの著者がどの著書を書いたのか知りたい場合。
mysql> SELECT * FROM author INNER JOIN article ON author.author_category = article.author_category;
+----+-----------------+-----------------+---------------------+----+--------------------------------+---------+-----------------+---------------------+
| id | name | author_category | created_at | id | title | content | author_category | created_at |
+----+-----------------+-----------------+---------------------+----+--------------------------------+---------+-----------------+---------------------+
| 1 | 佐藤太郎 | 1 | 2018-05-30 07:25:09 | 1 | ヘルスケアについて | 本文 | 1 | 2018-05-30 07:30:18 |
| 2 | 内田よしお | 2 | 2018-05-30 07:25:09 | 2 | スキンケアについて | 本文 | 2 | 2018-05-30 07:30:18 |
| 3 | 岡田んだ | 3 | 2018-05-30 07:25:11 | 3 | カードローンについて | 本文 | 3 | 2018-05-30 07:30:20 |
+----+-----------------+-----------------+---------------------+----+--------------------------------+---------+-----------------+---------------------+
この、一対多、多対多をうまく表現するのに、テーブルの結合がとても重要になってくると思います。
以上です。