MySQL でサブレベルをすべて再帰的に照会する方法

MySQLでは、再帰クエリ(Recursive Query)を使用して階層構造の子要素をすべて取得できます。MySQLは再帰クエリを直接サポートしていませんが、WITH RECURSIVE句と再帰結合を使用して再帰クエリを実装できます。

以下に、MySQLの再帰クエリですべての子要素を検索するためのサンプルクエリを示します。

まず、employeesという名前のテーブルがあり、そこにidとparent_idという列があり、従業員の階層関係を表しているとします。

CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
parent_id INT
);
INSERT INTO employees (id, name, parent_id) VALUES
(1, 'John', NULL),
(2, 'Mike', 1),
(3, 'Alice', 1),
(4, 'Bob', 2),
(5, 'Jane', 2),
(6, 'Tom', 3);

WITH RECURSIVEで再帰的に全ての子を取得することもできます。以下に全ての子を取得するクエリを示します。

WITH RECURSIVE subordinates AS (
SELECT id, name, parent_id
FROM employees
WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.parent_id
FROM employees e
INNER JOIN subordinates s ON e.parent_id = s.id
)
SELECT * FROM subordinates;

上記のクエリでは、WITH RECURSIVE句によってsubordinatesという一時表が生成され、employees表から選択されたid、name、parent_idカラムの、其中idが1のレコードを初期レコードとして含むレコードが含まれています。その後、この再帰部分はUNION ALLを使用して、employees表のレコードがsubordinates表のレコードと結合され、これ以上の子が発見できなくなるまで繰り返されます。

最後に、すべての部下を取得するために、サブオーディネイトテーブルからすべてのレコードを選択します。

再帰的なクエリは、特に大規模なデータセットを処理するときに、パフォーマンスの問題を引き起こす可能性があるため注意が必要です。再帰的なクエリを使用する際には、適切なインデックス処理と適切なクエリ最適化を行い、クエリパフォーマンスを向上させてください。

广告
広告は10秒後に閉じます。
bannerAds
bannerAds