我的第一篇帖子!似乎这是明智的地方;)
我目前正在进行一些测试,我首次尝试使用MPTT(修改预订树遍历)方法在PHP的帮助下将数据存储在我的Mysql数据库中。
但是,我正在尝试找出最具面向性能的方法,以便在特定级别上使用特定父级获取所有列表元素。
如果输入的父母将被命名为“Bilar”,那么这可能会转化为从下图中获取Saab和Chrysler类别。 (这意味着瑞典的汽车,如果这不是你最强的一面;)
由于我无法发布图片,因此这里是流程图的链接:http://www.phpsidan.nu/files/mptt/mptt1.png
目前我一直在做两个查询来做我想要的事情,以及相当多的代码来计算水平并吐出同一级别的所有其他元素。
有没有更好的方法来做到这一点,希望只使用一个查询?
非常感谢!
答案 0 :(得分: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
答案 1 :(得分:0)
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 有嵌套集的信息和查询示例
让NS中的直接孩子很复杂,因此有些人更喜欢将显式parent_id与“左”和“右”指针一起存储。