问题标签 [mptt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
20910 浏览

.net - 从父/子的平面列表构建层次结构对象

我有一个层次结构中的项目列表,我正在尝试将此列表解析为实际的对象层次结构。我正在使用修改后的预排序树遍历来存储/遍历这个列表,所以我拥有的是树的一个子集,包括所有子节点,按它们的“左”值排序。

例如,给定树:

  • 项目 A
    • A.1 项
    • A.2 项
      • 项目 A.2.2
  • B项
    • B.1 项
  • 项目 C

我得到清单:

  • 项目 A、项目 A.1、项目 A.2、项目 A.2.2、项目 B、项目 B.1、项目 C

(这是按照修改后的预购树设置中的“左”值的顺序)。

我想要做的是将其解析为包含树的实际结构的对象,例如:

平面列表作为 TreeObject 列表返回 - 每个 TreeObject 都有 ID、ParentID、Left 和 Right 属性。我正在寻找的是一个功能:

它接受平面列表,并返回一个嵌套列表。

换句话说:

我不知道如何做到这一点 - 跟踪父母,并能够处理更大的跳跃(例如,项目 A.2.2 -> 项目 B)。


编辑:我在这里寻找一个非暴力解决方案(例如,不循环多次,将项目移动到子节点,直到只剩下顶级父母)。我猜有一种优雅的方法可以循环一次,然后根据需要放置项目。

请记住,它们总是按层次顺序排列(因为我使用的是 MPTT),因此给定的项目将始终是前一个项目的子项或兄弟姐妹,或者至少与前一个项目共享一个父项。它永远不会出现在树的其他地方。

0 投票
2 回答
2456 浏览

python - 使用 django mptt 的问题

我在实现 django mptt 时遇到问题。

这是我的模型:

所以我正在研究的是如何将财务作为一个孩子添加到公司。我尝试mptt.register(Financials, parent = Company)了这当然会给我错误。

所以 mytree 结构将是:

谢谢

0 投票
6 回答
4895 浏览

sql - 查找嵌套集的面包屑

我正在使用嵌套集(又名修改的预排序树遍历)来存储组列表,并且我试图找到一种快速的方法来为所有组生成面包屑(作为字符串,而不是表格)一次。我的数据也使用邻接列表模型存储(有触发器使两者保持同步)。

例如:

代表树:

  • 节点 A
    • 节点 B
      • 节点 C
    • 节点 D
      • 节点 E
      • 节点 F

我希望能够有一个返回表的用户定义函数:


为了使这稍微复杂一些(尽管它有点超出了问题的范围),我还有需要遵守的用户限制。例如,如果我只能访问 id=3,当我运行查询时,我应该得到:

我确实有一个用户定义的函数,它以用户 ID 作为参数,并返回一个表,其中包含所有有效组的 ID,只要在查询中的某个位置

它会起作用的。


我有一个现有的标量函数可以做到这一点,但它不适用于任何合理数量的组(2000 个组需要 >10 秒)。它以 groupid 和 userid 作为参数,并返回一个 nvarchar。它找到给定的组父母(1个查询来获取左/右值,另一个查询来查找父母),将列表限制为用户有权访问的组(使用与上面相同的 WHERE 子句,因此还有另一个查询),然后使用游标遍历每个组并将其附加到字符串,最后返回该值。

我需要一种可以快速运行的方法(例如<= 1s),即时运行。

这是在 SQL Server 2005 上。

0 投票
2 回答
2732 浏览

php - 如何在 PHP 中将此 MPTT 数组转换为树结构?

我在数据库中有分层数据,以修改的预序树遍历格式存储。我在一个看起来像“SELECT ID, Left, Right, Name, etc FROM Table ORDER BY Left;”的查询中提取数据。我正在尝试将此数据从 DB 提供给我的平面数组转换为树结构,然后我将使用 PHP 的 json_encode 函数将其输出为 JSON。

不过,我无法让我的树结构代码在第一级之外工作。这是一个最小的测试用例:

这就是我得到的输出:

如您所见,“Grandchild”在某个地方迷路了,尽管 projectListToTree 函数中的输出似乎表明它应该在那里。似乎我扔给它的任何树结构都会将任何东西都放在第二层以下。对可能发生的事情有任何见解吗?

谢谢!

0 投票
1 回答
1519 浏览

php - 将 MPTT 结果集排序为多维数组 PHP

我一直在尝试修改的预排序树遍历模式,我的测试用例代码按预期返回结果,但是我无法将二维数组转换为多维数组来呈现它。

这是一个 3 级菜单结果的示例,我需要将其转换为多维数组,以便可以在 TAL 中对其进行迭代:

我需要对数据进行结构化,以便每个父母都有一个“孩子”键,它是一个重复的数组数组,对父母/孩子/孙子可以拥有的孩子数量没有限制,tree_depth 键由DBMS,所以我只需要改变数组的结构。

非常感谢任何指针,我玩过 usort() 和 array_walk_recursive 无济于事。

提前致谢

0 投票
1 回答
861 浏览

mysql - 对 MPTT 结果集中的项目进行排序?

我正在使用MPTT(修改的预序树遍历)模型将分层数据存储在我的 MySQL 表中。(MPTT 模型:另一种描述是嵌套集模型。)。我的问题是:有没有人想出一种聪明的方法来对树上的查询结果进行排序?我可以只使用“按标签排序”,但结果集将按标签排序,而不考虑节点在树中的位置或深度。

这是我用来检索任意节点的树的查询示例,每个节点的深度:

根据http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

当然,这总是按项目在嵌套集中的位置排序。如果我想通过“lastName”或“accountBalance”或“town”来订购它们怎么办?这可以在 MySQL 中完成,还是你们认为我必须求助于我的脚本语言对结果进行排序?

0 投票
2 回答
491 浏览

sql - MPTT 表的建议索引

我只是在使用修改的预排序树遍历 (MPTT) 构建一个表来存储分层数据——你知道的:每个节点都存储leftrightID 以查找其后代。我正在使用 CakePHP 建议的模型,它与标准方式不同parent_id,每行都包含 。

这是建议的表结构:

以前从未使用过这种风格,也不知道它是如何被搜索的,我想知道我应该索引哪些字段?只是主键就足够了,还是我也应该包括lft在内rght

0 投票
1 回答
5181 浏览

php - 在 CakePHP 树中查找子树

在 CakePHP 中,如何在模型中只选择一个子树是哪actsAs棵树?

我试过这个,找到以项目为首的树label = "My Label"

...但是查看日志,它运行以下 SQL:

这显然只选择了一个节点,而不是它的所有子节点。

0 投票
2 回答
2164 浏览

php - PHP 中的 MPTT(修改的预序树遍历)问题

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

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

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

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

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

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

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

非常感谢!

0 投票
1 回答
4334 浏览

django - Django treebeard AL、NS、MP 有什么区别

我正在尝试制作一个模型来对某些对象进行分类。

我已经尝试使用 django-mptt 轻松检索相关类别,现在我正在搜索不同的解决方案以找到最好的解决方案。

我不知道物化路径、邻接列表和嵌套集之间的主要区别是什么。维基百科没有给我一个简短的答案,我所知道的是 mptt 可能是嵌套集......

谁能用几句话向我解释一下?