作为对此问题的回应,Bill Karwin 发布了以下查询,以在给定任何特定树节点 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;
我自己已经在我自己的几个项目中成功地使用了这个查询,但我意识到我并不完全理解这个查询是如何以及为什么工作的。我觉得我对闭包表的设计有一个不错的理解(主要是通过阅读 Karwin 的关于 SQL 处理分层数据的套牌)。尽管如此,我不能“手指追踪”这个查询并解释它是如何构建结果集的。
具体来说,我在理解“treePaths”表(我理解为记录每个节点/叶子的祖先和后代关系的实际闭包表)上的第二个 JOIN 时遇到了最大的麻烦。这如何创建面包屑结果?