LoginSignup
1

More than 5 years have passed since last update.

テーブルの結合(MySQL)

Posted at

テーブルの結合

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

事例

記事メディアを事例にして考えて見ます。記事データベース(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 |
+----+-----------------+-----------------+---------------------+----+--------------------------------+---------+-----------------+---------------------+

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

以上です。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1