我在管理mysql中的分层数据时感到困惑

时间:2014-12-11 06:30:13

标签: php mysql database tree

我正在阅读此链接managing hierarchical data in mysql因为我在做MLM项目。这个例子说明了这一点。

enter image description here

但我在lft和rgt中混淆了。我想把我在会员中注册的成员的身份证明。我只是按照管理mysql中的分层数据的示例模式。

像这样的东西。所以lft和rgt值是我注册成员的id。

tree_table

id    parentid         lft       rgt

1        1              2         3

2        3              4          5

3        4              6           7

4        7              8           9 

我运行此SQL

 SELECT node.parentid,node.lft,node.rgt
    FROM tree_table AS node,
            tree_table AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
      AND parent.parentid = '1'
    ORDER BY node.lft;

但它只给我一条记录,它没有显示他所有的孩子或下线。输出是

 parentid   lft   rgt
   1         2     3

这是我的结构表

CREATE TABLE `tree_table` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `parentid` INT(11) NOT NULL DEFAULT '0',
    `lft` INT(11) NOT NULL DEFAULT '0',
    `rgt` INT(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)

请提前帮助我。

2 个答案:

答案 0 :(得分:0)

尝试在查询中删除“and parent.parent.id = 1”。数据是嵌套的a.k.a celko树。

答案 1 :(得分:0)

最初要做的最好的事情是阅读Joe Celko关于" Trees in SQL"的文章,以及一般的嵌套集理论(维基百科做得很合理:&#34 ; Nested set model&#34)。它需要一些练习和反思才能掌握它。

您似乎首先误解的是左/右值与键值无关,它们是完全独立的实体。他们所做的是 - 相互协调 - 反映数据的层次结构。

节点的左/右值定义其后代节点的左/右值的边界。以示例代码为例:FlashMP3 Players的后代,因为它的左/右都在MP3 Player's左/右定义的范围内。 Simialrly all 后续节点是Electronics的后代,因为它们的所有左/右值都在其左/右范围内。

相反,给定节点的祖先是左/右值完全落在所讨论的节点左/右的节点。 ElectronicsFlash的祖先,因为范围1-20在12-13范围之外(或周围)。

具有相邻左/右值的节点 - 如Flash - 隐式没有后代:后代的宽度没有宽度适合。

嵌套集非常快速地获取所有祖先或所有后代,但在获取直接父母,孩子或兄弟姐妹方面不是那么出色。为此,有时包含parent值也很好,该值表示父节点的 ID 。所以我们在那里有一个混合嵌套的set / adjacency list模型。维护树有更多的开销(C_UD,而不是R操作),但在Web环境中,读取数量级的压倒性写入,所以这通常没问题。

您的基本问题似乎是您认为left / right值与记录ID值相关,而不是。{/ p>

阅读这些文章,并对您的数据做一些检查,它应该开始有意义。但这并不是完全直截了当的,所以给自己一些时间。

使用嵌套集的一个警告:了解层次结构的反映方式只是其中的一部分。您还需要了解阅读祖先,后代,父母,孩子,兄弟姐妹所需的操作;并且需要了解添加/更新/删除节点所需的算法。这些都是非平凡的,还需要进一步阅读。但对这些问题的解释超出了这个问题的范围。