标签: nested-sets

在嵌套集中移动节点

我需要一个MySQL查询,它将一个节点及其所有子节点移动到一个嵌套集中.我发现这个网站,但该功能似乎只是如此不合逻辑-没有universeidtreeid嵌套集模型,代码本身只是感觉比什么需要更长的时间.我在表中唯一的额外列是parent.

我不能再删除并添加节点,因为它将丢失其ID.

mysql tree nested-sets hierarchical-data

23
推荐指数
2
解决办法
2万
查看次数

将修改后的预订树遍历模型(嵌套集)转换为<ul>

我试图将我的数据分层设置为树遍历模型到<ul>,以便在我的网站上显示.

这是我的代码:

function getCats($) {
  // retrieve all children of $parent
  $query = "SELECT max(rght) as max from t_categories";
  $row = C_DB::fetchSingleRow($query);
  $max = $row["max"];
  $result ="<ul>";
  $query = "SELECT * from t_categories where lft >=0 and rght <= $max";
  if($rs = C_DB::fetchRecordset($query)){
    $p_right ="";
    $p_left ="";
    $p_diff="";          
    while($row = C_DB::fetchRow($rs)){
      $diff = $row["rght"] -$row["lft"];

      if($diff == $p_diff){
        $result.= "<li>".$row['title']."</li>";
      }elseif (($row["rght"] - $row["lft"] > 1) && ($row["rght"] > $p_right)){
        $result. "<ul>";
        $result.= "<li>".$row['title']."</li>";

      }else{
        $result.= "<li>".$row['title']."</li>";
      } 

      $p_right = …
Run Code Online (Sandbox Code Playgroud)

html php traversal nested-sets

21
推荐指数
2
解决办法
2万
查看次数

如何使用PHP和MySQL将父子(邻接)表转换为嵌套集?

我花了最后几个小时试图在线找到这个问题的解决方案.我已经找到了很多关于如何从嵌套集转换为邻接的例子......但很少有相反的方法.我发现的示例要么不起作用,要么使用MySQL程序.不幸的是,我无法使用此项目的程序.我需要一个纯PHP解决方案.

我有一个使用下面的邻接模型的表:

id          parent_id         category
1           0                 Books
2           0                 CD's
3           0                 Magazines
4           1                 Books/Hardcover
5           1                 Books/Large Format
6           3                 Magazines/Vintage
Run Code Online (Sandbox Code Playgroud)

我想将它转换为下面的嵌套集:

id    left    right          category
0     1       14             Root Node
1     2       7              Books
4     3       4              Books/Hardcover
5     5       6              Books/Large Format
2     8       9              CD's
3     10      13             Magazines
6     11      12             Magazines/Vintage
Run Code Online (Sandbox Code Playgroud)

这是我需要的图像:

嵌套树形图

我有一个函数,基于此论坛帖子的伪代码(http://www.sitepoint.com/forums/showthread.php?t=320444),但它不起作用.我得到多个具有相同左侧值的行.这不应该发生.

<?php

/**

--
-- Table structure for table `adjacent_table`
--

CREATE TABLE IF NOT EXISTS `adjacent_table` ( …
Run Code Online (Sandbox Code Playgroud)

php mysql nested-sets adjacency-list

21
推荐指数
1
解决办法
1万
查看次数

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

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

例如,给定树:

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

我得到了清单:

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

(这是来自修改的预订树设置的"左"值的顺序).

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

Class TreeObject {
    String Name;
    Guid ID; 
    Guid ParentID;
    List<TreeObject> Children;
}
Run Code Online (Sandbox Code Playgroud)

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

List<TreeObject> FlatToHeirarchy(List<TreeObject> list); 
Run Code Online (Sandbox Code Playgroud)

获取平面列表,并返回嵌套列表.

换一种说法:

List<TreeObject> flatSet = LoadTreeObjectsFromDatabase(); 
// flatSet.count == 7; flatSet(0).Children == null
List<TreeObject> nestedSet = FlatToHeirarchy(flatSet);
// nestedSet.count == 3; nestedSet(0).Children.count == 2
Run Code Online (Sandbox Code Playgroud)

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


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

请记住,它们总是处于层级顺序(因为我正在使用MPTT),因此给定项目将始终是前一项目的子项或兄弟项目,或者至少与前一项目共享父项.它永远不会来到树的其他地方.

.net hierarchy mptt nested-sets

20
推荐指数
1
解决办法
2万
查看次数

如何使用SQL修复数据库中损坏的MPTT树(嵌套集)?

我存储在MySQL的超过10万条记录使用MPTT树lft,rghtparent_id列.现在左/右值已损坏,而父ID仍然完好无损.它需要大量的查询才能在应用程序层中修复它.是否有一种很好的方法来减轻数据库的负担并让它仅使用SQL重新计算左/右值?


为了澄清,我需要重新计算嵌套集的数值lft/rght值,而不是相邻记录的id.

嵌套集http://dev.mysql.com/tech-resources/articles/hierarchical-data-4.png

mysql sql mptt nested-sets

19
推荐指数
3
解决办法
6307
查看次数

如何对使用嵌套集模型存储的树进行排序?

当我提到嵌套集模型时,我指的是这里描述的内容.

我需要在用户定义的层次结构中构建一个用于存储"类别"(我想不出更好的词)的新系统.由于嵌套集模型针对读取而不是写入进行了优化,因此我决定使用它.不幸的是,在我研究和测试嵌套集时,我遇到了如何显示带有排序节点的分层树的问题.例如,如果我有层次结构:

root
    finances
        budgeting
            fy08
    projects
        research
        fabrication
        release
    trash
Run Code Online (Sandbox Code Playgroud)

我希望对它进行排序,使其显示为:

root
    finances
        budgeting
            fy08
    projects
        fabrication
        release
        research
    trash
Run Code Online (Sandbox Code Playgroud)

请注意,制作在研究之前出现.

无论如何,经过长时间的搜索,我看到了诸如"将树存储在一个多维数组中并对其进行排序"和"求助树并序列化回嵌套集模型"的答案(我正在解释......).无论哪种方式,第一个解决方案是RAM和CPU的可怕浪费,这两者都是非常有限的资源......第二个解决方案看起来像很多痛苦的代码.

无论如何,我能够弄清楚如何(使用嵌套集模型):

  1. 在SQL中启动一个新树
  2. 将节点作为树中另一个节点的子节点插入
  3. 在树中的兄弟节点之后插入节点
  4. 使用SQL中的层次结构拉出整个树
  5. 从具有或不具有深度限制的层次结构中的特定节点(包括根)拉出子树
  6. 找到树中任何节点的父节点

所以我认为#5和#6可用于进行我想要的排序,它也可以用于按排序顺序重建树.

但是,现在我已经了解了所有这些我学会了做的事情,我看到#3,#5和#6可以一起用来执行排序插入.如果我做了排序插入,它总是被排序.但是,如果我改变排序标准或者我想要一个不同的排序顺序,我就会回到原点.

这可能只是嵌套集模型的限制吗?它的使用是否会抑制输出的查询排序?

database tree hierarchy nested-sets

16
推荐指数
1
解决办法
1万
查看次数

嵌套间隔是嵌套集(修改的预订遍历)RDBMS性能降级的可行解决方案吗?

在Joe Celko的嵌套集(修改的预订遍历)的已知限制中,随着树变大到大,性能上的标记会降低.

Vadim Tropashko提出了嵌套区间,并在本文中提供了示例和理论解释:http://arxiv.org/html/cs.DB/0401014

这是一个可行的解决方案,是否有任何可行的示例(使用任何语言)从原生数据库层抽象出来?

database algorithm nested-sets

11
推荐指数
1
解决办法
5388
查看次数

允许某个类别拥有多个父母是否有意义?还有替代品吗?

简短问题:如何管理出现在多个类别下的产品类别?完全这样做是不好的做法?

背景信息: 我们有一个产品数据库,其类别如下:

Products

  -Arts and Crafts Supplies
    -Glue
    -Paper Clips
    -Construction Paper


  -Office Supplies
    -Glue
    -Paper Clips
Run Code Online (Sandbox Code Playgroud)

请注意,胶水和纸夹分配给两个类别.虽然它们出现在此类别树中的两个不同位置,但它们在数据库中具有相同的类别ID.为什么?两个原因:

  1. 为类别分配属性 - 例如,回形针可以具有重量,材料,颜色等.
  2. 分配到胶水类别的产品显示在工艺品和办公用品下.这是预期的 - 它们与数据库中的实际类别ID相同.

这允许我们管理单个类别及其属性和分配的产品,但将其放置在类别树中的多个位置.

我们使用的是嵌套集模型,因此我们用来支持它的db结构是:

Category
----------
CategoryID
CategoryName


CategoryTree
------------
CategoryTreeID
CategoryID
Lft
Rgt
Run Code Online (Sandbox Code Playgroud)

因此,Category和CategoryTree之间存在1:M,因为类别树中可能存在给定类别的多个实例.

有没有更简单的方法来模拟这个允许产品类别显示在多个类别下?

database database-design nested-sets categories

11
推荐指数
1
解决办法
3352
查看次数

MySQL嵌套集 - 如何查找节点的父节点?

我使用以下列运行了mill嵌套集层次结构类型设置:

表名:

myset
Run Code Online (Sandbox Code Playgroud)

列:

id, name, lft, rgt
Run Code Online (Sandbox Code Playgroud)

有没有人知道查询来确定节点的节点?

我读了几个地方,在你的表中有一个parent_id列来跟踪这个很方便,但它似乎是多余的,如果在添加/时查询被错误地执行,它似乎可能与嵌套集不同步移除/移动集合中的任何内容.

mysql sql hierarchy nested-sets

11
推荐指数
2
解决办法
2万
查看次数

如何使用MySQL和PHP中的嵌套集获取结构化结果?

深度没有限制.

如何获得结构化分支甚至整个树?

定义来自此处:在MySQL中管理分层数据

php mysql nested-sets

11
推荐指数
2
解决办法
4296
查看次数