今回は、MySQLにおける「自己結合(Self Join)」について、研修でよく取り上げられるテーマをもとにわかりやすく解説します。
自己結合ってなに?
自己結合とは、同じテーブルを2回使って結合することです。
「え?同じテーブルを2回使うってどういうこと?」と思った方も多いかもしれませんね。
例えるなら、社員名簿を2冊コピーして、それぞれに別の役割(部下と上司)を持たせて見比べるようなイメージです。
今回の例:従業員と上司の関係
以下のような employees
テーブルを使います。
id | name | manager_id |
---|---|---|
1 | John | NULL |
2 | Alice | 1 |
3 | Bob | 1 |
4 | Charlie | 2 |
このテーブルでは、manager_idがその従業員の上司の id
を表しています。
ステップ①:テーブルの作成とデータ挿入
まずはテーブルを作成して、データを入れましょう!
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT
);
INSERT INTO employees (id, name, manager_id)
VALUES
(1, 'John', NULL),
(2, 'Alice', 1),
(3, 'Bob', 1),
(4, 'Charlie', 2);
ステップ②:自己結合を使って上司を取得!
ここでいよいよ自己結合の登場です。
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM
employees e
JOIN
employees m ON e.manager_id = m.id;
クエリ解説(図解イメージ)
別名 | 意味 |
---|---|
e | 部下側のテーブル |
m | 上司側のテーブル |
e.manager_id = m.id
が「部下の上司IDと上司のIDを一致させる条件」です。
実行結果はこうなります:
employee_name | manager_name |
---|---|
Alice | John |
Bob | John |
Charlie | Alice |
つまり、
- Alice → Johnが上司
- Bob → Johnが上司
- Charlie → Aliceが上司
…という構造が一目でわかりますね!
補足:上司がいない従業員も表示したいときは?
たとえば、Johnのように上司がいない人も表示したい場合は、JOIN
をLEFT JOIN
に変更します。
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM
employees e
LEFT JOIN
employees m ON e.manager_id = m.id;
employee_name | manager_name |
---|---|
John | NULL |
Alice | John |
Bob | John |
Charlie | Alice |
自己結合の応用アイデア
自己結合は、上司と部下だけでなく、こんな関係性にも使えます。
- カテゴリと親カテゴリ(例:商品分類)
- フォルダと親フォルダ(例:ファイル構造)
- ユーザーと紹介者(例:紹介制度)
まとめ
ポイント | 説明 |
---|---|
自己結合とは? | 同じテーブルを別名で2回登場させて結合すること |
どんなときに使う? | 「同じ種類のデータ間の関係性」を表現したいとき |
JOIN条件の工夫 | ON 句で適切なカラム同士を結びつける |
LEFT JOINも覚えておくと便利! | NULLがあっても全部表示したいときに活躍 |
今後の学習の指針
- 自己結合で階層構造(再帰的な関係)を扱う方法も調べてみよう
WITH
句やCTE(共通テーブル式)
と組み合わせることで、自己結合をさらに読みやすくできる- 自己結合で作成したビューを活用して、他のクエリをシンプルにする方法も検討してみよう
自己結合は、最初はちょっと混乱するかもしれませんが、慣れてくると「同じテーブル内の関係性を可視化する力」になります!