MySQLの再帰クエリでツリー構造を実現する方法
MySQLで再帰クエリを使用して樹構造のノードを検索する場合、一般的な方法はCTE(コモンテーブル式)を使った再帰クエリです。
- 木のノードの情報を格納するテーブルを作成します。内容としては、ノードのIDと親ノードのIDを含めます。例:
- CREATE TABLE tree ( id INT PRIMARY KEY, parent_id INT, name VARCHAR(255) );
- 例えば、樹ノードにデータを挿入する
- 1行目に’Root’、2行目に’Node 1’、3行目に’Node 2’、4行目に’Node 1.1’、5行目に’Node 1.2’、6行目に’Node 2.1’という名前の行を’tree’テーブルに挿入します。
- 例えば、CTE を使って再帰的クエリを実行する
- 再帰的共通表式(CTE)tree_recursiveを使用して、
SELECT id, parent_id, name
FROM tree
WHERE id = 1
UNION ALL
SELECT t.id, t.parent_id, t.name
FROM tree t
INNER JOIN tree_recursive tr ON t.parent_id = tr.id
)
SELECT * FROM tree_recursive; - このクエリはIDが1のノードを起点として、そのすべての子ノードを再帰的に検索します。結果は、すべてのノードを含む一時テーブルとして返され、ノードのID、親ノードのID、および名前が含まれます。
これは基本的なアプローチですが、状況に合わせて調整・最適化する必要があります。MySQL では再帰クエリのパフォーマンスは、PostgreSQL などの他のデータベースほど最適化されていない可能性があります。ツリーの階層が深い場合、パフォーマンスの問題が発生する可能性があります。