「同じテーブルを自分自身に結合する」のが自己結合です。
初めて見ると「え、同じテーブルをJOIN…?」と戸惑いますが、
⭐️ 親子・上下の関係が1つのテーブルに入っているときの定番テクニックです。
例:社員テーブル(社員も上司も“社員”)
上司も社員なので、同じ employees テーブルに入っています。
| id | name | manager_id(上司のid) |
|---|---|---|
| 1 | 山田(部長) | (なし) |
| 2 | 佐藤 | 1 |
| 3 | 鈴木 | 1 |
「各社員と、その上司の名前を並べて出したい」とき、
employees をもう一度、別名で結合します。
SELECT
emp.name AS 社員,
boss.name AS 上司
FROM employees AS emp
LEFT JOIN employees AS boss -- ← 同じテーブルを別名で結合
ON emp.manager_id = boss.id;
結果:
| 社員 | 上司 |
|---|---|
| 山田(部長) | (なし) |
| 佐藤 | 山田(部長) |
| 鈴木 | 山田(部長) |
ポイントは「別名(AS)」
同じテーブルなので、AS emp / AS boss と別名を付けて別テーブル扱いにするのが肝です。
-
emp.name… 社員本人の名前 -
boss.name… 上司の名前
別名がないと「どっちの name?」が区別できません。
LEFT JOIN にする理由
上司がいない人(部長など)も結果に残したいので LEFT JOIN を使います。
INNER JOIN だと上司がいない行が消えてしまいます。
まとめ
親子・上下の関係が同じテーブルにあるとき、テーブルを別名で自分自身に結合すると「本人+相手」を1行に並べられる。 これが自己結合。
社員×上司、カテゴリ×親カテゴリ、取引先×その親の取引先など、
「同じ種類のもの同士の関係」を1テーブルで持つ設計で活躍します。
Top comments (0)