コメントで述べたように、mysqlには簡単な方法はありません。
しかし!
データベース構造を変更する可能性がある場合は、ツリーのような階層を処理するためのより優れた設計を展開できます。
このチュートリアル をフォローしている場合 ビル・カーウィンから( こちら スライドショーのチュートリアルを参照する元の回答です)、階層構造をモデル化するために使用される4つの方法を見つけることができます:
- Adiacency List
- パスの列挙
- 入れ子集合
- クロージャーテーブル
さて、可能な限り最良のモデルは4番目のモデルです(他の3つのモデルの説明は読者に任せます)。これには基本的に2つのテーブルが必要です。1つは要素用、もう1つはパス用です。パステーブル(クロージャテーブル自体)には、各ノードからすべての子孫(直接の子だけでなく)へのすべてのパスを格納します。
ツリー内の直接の子のクエリが簡単になるため、各行のパスの長さも保存することをお勧めします。
このソリューションがより多くのスペースを必要とする場合でも、全体的なパフォーマンスが最高で、非常に使いやすいです。再帰クエリにまったく依存せず、データセット全体の参照整合性を付与します。
たとえば、ノード#4のすべての子を取得するには:
select a.*
from nodes a
join paths b
on a.node_id = b.descendant
where b.ancestor = 4
別の例:ノード#11のすべての祖先を取得する
select a.*
from nodes a
join paths b
on a.node_id = b.ancestor
where b.descendant = 11
ノード#6のサブツリーを削除する必要があります
delete from paths where descendant in
(select descendant from paths where ancestor = 6)