2

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

它使查找给定项目的所有子项变得容易。

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

行示例:

Parent_ID、Taxon_ID、Taxon_Name、lft、rgt

对于 somerow(taxon_id) 我想知道它离根节点有多远。

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

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

4

2 回答 2

3

我想到了。

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

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

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

于 2012-09-04T20:44:12.227 回答
0

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

如果“这个节点有多深?” 是您经常需要回答的问题,您可以考虑调整表的架构,以便每个节点存储并保持其深度。然后你可以只读取那个值而不是用笨拙的递归来计算它。(如果您对表进行洗牌,深度值的维护可能会变得乏味,但假设您执行的写入操作比读取操作少得多,这是一种更有效的方法。)

于 2012-09-04T19:18:23.387 回答