MySQL で再帰的な子ノードを照会する方法
MySQLでは、再帰的な子ノードの検索は、再帰的なクエリステートメントを使用することで実現できます。MySQL自体には再帰的な検索機能はありませんが、ストアドプロシージャまたはビューを使用してシミュレーションすることができます。
よく使われる方法には、ストアドプロシージャを使用して再帰クエリを実行することがあります。以下にストアドプロシージャの例を示します。
DELIMITER //
CREATE PROCEDURE recursiveQuery(IN parentId INT)
BEGIN
-- 创建临时表用于存储查询结果
CREATE TEMPORARY TABLE tempTable (
id INT,
name VARCHAR(255),
parent_id INT
);
-- 插入初始节点
INSERT INTO tempTable
SELECT id, name, parent_id
FROM your_table
WHERE parent_id = parentId;
-- 递归查询子节点
INSERT INTO tempTable
SELECT t.id, t.name, t.parent_id
FROM your_table t
INNER JOIN tempTable tt ON t.parent_id = tt.id;
-- 返回查询结果
SELECT * FROM tempTable;
-- 清空临时表
DROP TABLE tempTable;
END //
DELIMITER ;
上記ストアドプロシージャでは、まず一時テーブルtempTableをクエリ結果を格納するために作成します。次に、最初のノードを挿入し、再帰クエリによって子ノードを一時テーブルに挿入します。最後に、クエリ結果を返して一時テーブルを空にします。
ストアドプロシージャを使用する時は、ストアドプロシージャを呼び出し、元のノードの ID を渡すことで再帰クエリを実現できます。例えば、ストアドプロシージャ recursiveQuery(1) を呼び出すと、ID が 1 のノードとそのすべての子ノードが照会されます。
もう1つの方法は、ビューを使用して再帰的なクエリーを実装することです。次のビュー定義は、その例です。
CREATE VIEW recursiveView AS
WITH RECURSIVE tempView(id, name, parent_id) AS (
SELECT id, name, parent_id
FROM your_table
WHERE parent_id IS NULL
UNION ALL
SELECT t.id, t.name, t.parent_id
FROM your_table t
INNER JOIN tempView tv ON t.parent_id = tv.id
)
SELECT * FROM tempView;
WITH RECURSIVE tempView AS (
SELECT * FROM table WHERE parent_id IS NULL
UNION ALL
SELECT t.* FROM tempView AS p
INNER JOIN table AS t ON p.id = t.parent_id
)
SELECT * FROM tempView
再帰的なクエリを利用するには、ビューを使用し、ビューrecursiveViewから直接照会することで実現できます。たとえば、SELECT * FROM recursiveViewを実行すると、すべてのノードとその子ノードのクエリ結果が返されます。
ストアドプロシージャやビューを使用していても、再帰クエリはデータ量が多かったり再帰階層が深かったりするとパフォーマンス問題が発生する可能性があるため、注意深く使用する必要があります。