嵌套深度

时间:2012-09-04 19:05:10

标签: mysql tree nested-sets depth

我有一个大的mysql表,父子关系存储在嵌套集模型中(左右值)。

找到给定项目的所有子项很容易。

现在,我如何找到某个项目的深度。

行的示例:

Parent_ID,Taxon_ID,Taxon_Name,lft,rgt

for somerow(taxon_id)我想知道它与根节点的距离。

现在可能需要注意的是,我在数据结构中的方式是每个终端节点(没有子节点的节点)lft = rgt。我知道网上发布的很多例子都有rgt = lft +1,但我们决定不这样做只是为了方便。

要点: 嵌套集模型,需要找到给定节点的深度(到达根节点的数量)。

2 个答案:

答案 0 :(得分:3)

我明白了。

基本上,您必须查询包含您要查找的节点的所有节点。例如,我正在查看一个lft = rgt = 7330的节点,我想要它的深度。我只需要

Select count(*) 
 from table 
 where lft<7330 
 AND   rgt>7330

您可能希望在使用之前将1添加到结果中,因为它确实告诉您前面的代数而不是实际级别。但它有效且速度快!

答案 1 :(得分:0)

MySQL不支持递归查询。我相信PostgreSQL提供有限的支持,但它会效率低下而且杂乱无章。但是,没有理由不能以递归方式(即以编程方式)执行查询以获得所需结果。

如果“这个节点有多深?”这是一个经常需要回答的问题,您可以考虑调整表的模式,以便每个节点存储并保持其深度。然后你可以只读取该值而不是通过笨拙的递归来计算它。 (如果你正在改变表格,维护深度值可能会变得乏味,但假设你写的数量远远少于读取,这是一种更有效的方法。)