テーブルの結合（MySQL）

# テーブルの結合

個人的にあまり理解できなかったテーブルの結合について、勉強をかねて説明して行きます。

## 事例

記事メディアを事例にして考えて見ます。記事データベース（`media`）の中にある、２つのテーブルを結合するとします。
２つのテーブルの構成は以下の通りです。

- `article`テーブル
    - タイトル
    - 本文
    - 記事カテゴリー`No.`

```sql: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.`

```sql: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 |                |
+-----------------+-------------+------+-----+-------------------+----------------+
```

### 仮で作成したテーブルに仮のデータを挿入する

挿入文載せておきます。

```sql: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);
```

その結果です。

```sql: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 |
+----+--------------------------------+---------+-----------------+---------------------+
```

挿入文載せておきます。

```sql: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);
```

その結果です。

```sql: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
例えば、著者と著書の全ての組み合わせを見たいと思った時。

```sql
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 |
+----+-----------------+-----------------+---------------------+----+--------------------------------+---------+-----------------+---------------------+
```

### 一対多のテーブルの結合

仮に、記事メディアのカテゴリーは１人の著者しかいない場合、どの著者がどの著書を書いたのか知りたい場合。

```sql
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 |
+----+-----------------+-----------------+---------------------+----+--------------------------------+---------+-----------------+---------------------+
```

---

この、一対多、多対多をうまく表現するのに、テーブルの結合がとても重要になってくると思います。

以上です。

## 参考

- http://akiyoko.hatenablog.jp/entry/2016/07/31/232754