3

我在这里的第一篇文章!似乎这是变得明智的地方;)

我目前正在进行一些测试,我第一次尝试在 PHP 的帮助下尝试使用 MPTT(修改的预序树遍历)方法在我的 Mysql 数据库中存储数据。

但是,我试图找出最以性能为导向的方法来获取特定级别的所有列表元素,并具有特定的父级。

这可以转化为从下图中获取 Saab 和 Chrysler 类别,如果输入的父级将被命名为“Bilar”。(这意味着瑞典语中的汽车,如果那不是你最强的一面;))

因为我不能发布图片,这里是流程图的链接:http ://www.phpsidan.nu/files/mptt/mptt1.png

目前我一直在做两个查询来做我想做的事,还有相当多的代码来计算级别并吐出同一级别的所有其他元素。

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

非常感谢!

4

2 回答 2

1

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 有嵌套集的信息和查询示例

在 NS 中获取直接子代很复杂,因此有些人更喜欢将显式 parent_id 与“left”和“right”指针一起存储。

于 2009-10-28T16:40:27.473 回答
1

我相信这可以优化,但是假设您有“name”、“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
于 2010-02-07T20:39:51.700 回答