繁体   English   中英

数据库:对分层数据进行排序(修改后的预订树遍历):如何检索直接子项

[英]Database: Sorting hierarchical data (Modified Preorder Tree Traversal): How to retrieve immediate children

我在PHP和Doctrine 2中使用MySQL。

我的问题是假设我正在使用修改预订树遍历是否有一种方法我只能检索直接的孩子?

正如您所发现的,这在MPTT设计中并不那么容易。 你知道如何得到所有的后代:

SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;

你需要的是没有祖先的后代集合,这些祖先也是你正在开始的父节点的后代。

SELECT * FROM tree t1 WHERE t1.lft BETWEEN 2 AND 11 
  AND NOT EXISTS (SELECT * FROM tree t2 WHERE t2.lft > 2 AND t2.lft < 11 
                    AND t1.lft > t2.lft AND t1.rgt < t2.rgt);

除了lft和rgt值之外,您还可以存储每个孩子的父ID。 这样做的一个好处是,如果您的lft和rgt值搞砸了,您可以重新生成树。 它还允许您直接确定父节点的直接子节点。

得到了相同的要求,这将是一种更简单的方式

select * from tree t1
where t1.nodeleft > 1
and 1 in (select count(*) from tree where tree.nodeleft < t1.nodeleft and tree.noderight > t1.noderight)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM