这个问题是对这篇文章的跟进:
我喜欢 ClosureMap 解决方案,但我还有一个问题要解决。
如何轻松检索树中特定节点的路径?例如,如果您查看提供的树:
ID 节点名称
1 “节点 1”
2 “节点 1.1”
3 “节点 2”
4 “节点 1.1.1”
5 “节点 2.1”
6 “节点 1.2”
1.1.1 的路径是:
ID = 1、2、4
如果不进行递归 SQL 调用,是否有一种优雅的方式来检索路径?
这个问题是对这篇文章的跟进:
我喜欢 ClosureMap 解决方案,但我还有一个问题要解决。
如何轻松检索树中特定节点的路径?例如,如果您查看提供的树:
ID 节点名称
1 “节点 1”
2 “节点 1.1”
3 “节点 2”
4 “节点 1.1.1”
5 “节点 2.1”
6 “节点 1.2”
1.1.1 的路径是:
ID = 1、2、4
如果不进行递归 SQL 调用,是否有一种优雅的方式来检索路径?
SELECT ancestor_id
FROM ClosureTable
WHERE descendant_id = 4;
返回值 1、2、4。但它们在单独的行中返回,并且它们没有表明它们的顺序正确(我们可能不假设数字顺序对应于树层次结构顺序)。
有时您还会将每个路径的深度存储在ClosureTable
. 但即使没有,您也可以计算给定节点有多少祖先,并使用它进行排序:
SELECT ct1.ancestor_id, COUNT(*) AS depth
FROM ClosureTable ct1
JOIN ClosureTable ct2 ON (ct1.ancestor_id = ct2.descendant_id)
WHERE ct1.descendant_id = 4
GROUP BY ct1.ancestor_id
ORDER BY depth;
是的,这仍然返回三行的结果。如果您使用 MySQL,则可以访问GROUP_CONCAT()
. 否则,很容易获取三行并将它们的值连接到应用程序代码中。
我想我找到了最好的解决方案,并没有真正意识到它在我提到的帖子中:)。
Site Point 有一篇不错的文章,展示了如何使用 Left/Right 属性检索特定节点:
http://www.sitepoint.com/article/hierarchical-data-database/2/