今回は、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(共通テーブル式)と組み合わせることで、自己結合をさらに読みやすくできる- 自己結合で作成したビューを活用して、他のクエリをシンプルにする方法も検討してみよう
 
自己結合は、最初はちょっと混乱するかもしれませんが、慣れてくると「同じテーブル内の関係性を可視化する力」になります!