ここでは弊社の新人エンジニア研修の参考にテーブルの自己結合を行う方法について解説します。

MySQLにおけるテーブルの自己結合の例を以下に示します。例として、従業員(employees)テーブルを使用して、従業員の上司との関係を示す結合を行います。通常は上司も一種の従業員なので同じ表にいるはずです。

例えば、以下のテーブルではJohnには上司がいません。AliceとBobの上司はJohnでCharlieの上司はアリスです。

employeesテーブル

まず、上記のemployeesテーブルの作成とデータの挿入を行います。

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);

上記の例では、従業員のIDと名前を保持するemployeesテーブルを作成し、manager_id列を使用して上司との関係を表しています。上司が存在しない場合はNULLとなります。

次に、従業員と上司の関係を示す自己結合を行います。以下のクエリを使用します。

SELECT e.name AS employee_name, m.name AS manager_name    -- この行は、従業員の名前とマネージャーの名前を選択します。"AS"キーワードは、選択したカラムのエイリアス(別名)を設定します。この場合、"e.name"は"employee_name"として、"m.name"は"manager_name"として表示されます。

FROM employees e                                        -- この行は、データの取得元となるテーブルを指定します。ここでは"employees"テーブルからデータを取得します。"e"はこのテーブルのエイリアスで、これにより後続の行で"e"と書くだけで"employees"テーブルを参照することができます。

JOIN employees m ON e.manager_id = m.id;               -- この行は、"employees"テーブルをもう一度自己結合します。ただし、ここでは"m"という新しいエイリアスを使用しています。"ON"キーワードの後の条件(e.manager_id = m.id)は、結合する際の一致条件を示しており、各従業員の"manager_id"が、そのマネージャーの"id"と一致する場合に結合します。

このクエリでは、employeesテーブルを従業員(e)と上司(m)の2つの別名を付けたテーブルとして結合しています。結合条件として、従業員のmanager_idが上司のidに一致するように指定しています。

この結果、従業員の名前(employee_name)とその上司の名前(manager_name)の組み合わせが表示されます。

例の結果は次のようになります:

自己結合の結果

上記の結果では、AliceとBobはJohnの部下であり、CharlieはAliceの部下であることがわかります。これにより、従業員と上司の関係が自己結合によって取得されました。

以上、テーブルの自己結合を行う方法でした。

最後までお読みいただきありがとうございます。