この質問への回答として、Bill Karwin は、特定の tree-node-id を指定して、順序付けられたサブツリーをプルバックする次のクエリを投稿しました。
SELECT d.`iD`, d.`subsectionOf`,
CONCAT(REPEAT('-', p.`len`), d.`name`) as hier,
p.`len`, p.`ancestor`, p.`descendant`,
GROUP_CONCAT(crumbs.`ancestor`) AS breadcrumbs
FROM `TreeData` AS d
JOIN `TreePaths` AS p ON d.`iD` = p.`descendant`
JOIN `TreePaths` AS crumbs ON crumbs.`descendant` = p.`descendant`
WHERE p.`ancestor` = 1
GROUP BY d.`iD`
ORDER BY breadcrumbs;
私自身、いくつかのプロジェクトでこのクエリをうまく使用しましたが、このクエリがどのように、なぜ機能するのかを正確に理解していないことに気付きました。私は、クロージャ テーブルの設計について十分に理解していると感じています (主に、階層データを処理する SQL に関する Karwin のデッキを読むことによって)。とはいえ、このクエリを「フィンガー トレース」して、結果セットがどのように構築されているかを説明できるとは思えません。
具体的には、「treePaths」テーブルの2番目のJOINを理解するのに最も苦労しています(これは、各ノード/リーフの先祖と子孫の関係を記録する実際のクロージャーテーブルであると理解しています)。これにより、ブレッドクラムの結果がどのように作成されますか?