4

这个问题是对这篇文章的跟进:

将平面表解析为树的最有效/优雅的方法是什么?

我喜欢 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 调用,是否有一种优雅的方式来检索路径?

4

2 回答 2

1
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(). 否则,很容易获取三行并将它们的值连接到应用程序代码中。

于 2009-08-17T19:52:33.503 回答
0

我想我找到了最好的解决方案,并没有真正意识到它在我提到的帖子中:)。

Site Point 有一篇不错的文章,展示了如何使用 Left/Right 属性检索特定节点:

http://www.sitepoint.com/article/hierarchical-data-database/2/

于 2009-08-17T20:03:16.210 回答