Mysql 嵌套集深度

Mysql 嵌套集深度,mysql,tree,nested-sets,depth,Mysql,Tree,Nested Sets,Depth,我有一个大型mysql表,其父子关系存储在嵌套的集合模型中(左值和右值) 它可以很容易地找到给定项目的所有子项 现在,我如何找到某个项目的深度 行的示例: 父项ID、分类单元ID、分类单元名称、lft、rgt 对于somerow(分类单元id),我想知道它离根节点有多远 现在,这里可能需要注意的是,我对数据进行结构化的方式是,每个终端节点(没有自己的子节点的节点)lft=rgt。我知道许多在线发布的示例都有rgt=lft+1,但我们决定不这样做只是为了方便 总结: 嵌套集模型,需要找到给定节点的

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

它可以很容易地找到给定项目的所有子项

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

行的示例:

父项ID、分类单元ID、分类单元名称、lft、rgt

对于somerow(分类单元id),我想知道它离根节点有多远

现在,这里可能需要注意的是,我对数据进行结构化的方式是,每个终端节点(没有自己的子节点的节点)lft=rgt。我知道许多在线发布的示例都有rgt=lft+1,但我们决定不这样做只是为了方便

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

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

如果“这个节点有多深?”是一个经常需要回答的问题,你可以考虑调整表的模式,以便每个节点存储和维护它的深度。然后,您可以读取该值,而不是使用笨拙的递归计算它。(如果您正在洗牌表,则深度值的维护可能会变得单调乏味,但假设您所做的写操作远远少于读操作,这是一种更有效的方法。)

我找到了答案

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

Select count(*) 
 from table 
 where lft<7330 
 AND   rgt>7330
选择计数(*)
从桌子上
lft7330在哪里

在使用结果之前,您可能希望将1添加到结果中,因为它实际上告诉您之前的代数,而不是实际级别。但是,它的工作和它的速度

应该有一种非递归的方法来检索节点的深度。