2009-10-28 70 views
2

我的第一篇文章!似乎这是获得明智的地方;)PHP中的MPTT(Modified Preorder Tree Traversal)问题

我目前正处于一些测试的中间,我有史以来第一次尝试使用MPTT(修改预定义树遍历)方法将数据存储在我的Mysql数据库中的PHP。

但是,我试图找出最具性能的方式来获取特定级别上的所有列表元素,以及特定的父级。

如果输入的父母名称为“Bilar”,则可以从下图中转换为Saab和Chrysler类别。 (这意味着汽车在瑞典,如果心不是你最强的一面;))

正如我不能发表图片,下面就以流程图的链接:http://www.phpsidan.nu/files/mptt/mptt1.png

目前我一直在做两个querys做什么我想,还有相当数量的代码来计算水平,并吐出同一水平上的所有其他元素。

有没有更好的方法来做到这一点,并希望只使用一个查询?

非常感谢!

回答

1

我相信这可以进行优化,但假设您有“名称”,“lft”和“rgt”列,以下将给出“Bilar”的2级兄弟姐妹。

SELECT node.name,                                  
     node.lft AS sort,                                                                
     (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth                   

FROM car AS node,                                 
    car AS parent,                                 
      car AS sub_parent,                                
      (SELECT node.name, (COUNT(parent.name) - 1) AS depth                       
       FROM car AS node,                               
         car AS parent                               
       WHERE node.lft BETWEEN parent.lft AND parent.rgt                        
        AND node.name = "Bilar"                              
      GROUP BY node.name                                
      ORDER BY node.lft) AS sub_tree 

WHERE node.lft BETWEEN parent.lft AND parent.rgt                          
    AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt                        
    AND sub_parent.name = sub_tree.name 

GROUP BY node.name HAVING depth <= 2                             
ORDER BY node.lft 
0

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 对嵌套集合

得到直接孩子在NS复杂的相关信息和查询的例子,因此,有些人喜欢存储与“左”和“右”的指针沿着明确PARENT_ID。

+0

嗨Stereofrog, 感谢您的时间。这是理所当然的选择,但需要一点MPTT的好处。 有没有其他人在这种类型的元素分类/排序有经验? 谢谢! – Industrial 2009-10-30 08:16:40