【问题标题】:I am confuse in managing hierarchical data in mysql我对在 mysql 中管理分层数据感到困惑
【发布时间】:2014-12-11 06:30:12
【问题描述】:

我正在阅读此链接managing hierarchical data in mysql,因为我正在做传销项目。示例显示了这一点。

但我对 lft 和 rgt 感到困惑。我想把我在传销中注册的成员的 ID。我只是按照示例的模式在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`)
)

请帮我提前谢谢你。

【问题讨论】:

  • 如果投反对票的人解释他们投反对票的为什么会更有帮助。对我来说似乎是一个合理的问题。
  • @AdamCameron:嗨,他有 2 个嵌套集的答案。看看他的历史。他应该慢慢来。投票结束!!!

标签: php mysql database tree


【解决方案1】:

尝试删除查询中的“and parent.parent.id=1”。数据是一个嵌套集,也就是 celko 树。

【讨论】:

  • 如果我将删除它,我无法过滤,目的是显示所有孩子,例如 parentid 4,因此它将显示 6、7、8 和 9
  • 它是一个嵌套集合。你需要左右值。
  • @ashTon:left 和 right 值来自深度优先遍历。但是你给出的值是完全错误的。当您有父母身份时,也不需要它。这就是为什么我问它的功课。你应该把它标记为家庭作业。嵌套集很昂贵,但有时速度更快。
【解决方案2】:

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

您似乎误解的第一件事是左/右值与键值无关,它们是完全独立的实体。它们所做的是——相互配合——反映数据的层次结构。

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

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

具有相邻左/右值的节点 - 例如Flash - 隐式没有后代:其范围没有宽度可供后代适应。

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

您的基本问题似乎是您认为 left/right 值与记录 ID 值相关,但事实并非如此。

去阅读那些文章,并用你的数据做一些桌面检查,它应该开始有意义了。但这并不完全直截了当,所以请给自己一些时间。

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

【讨论】:

  • 感谢您的快速回复,..只想问一下 lft 和 rgt 值来自哪里?我们从哪里获得这些值,在您提供的链接中它们已经给出。,我不知道如何将它应用到我的应用程序中以获得 lft 和 rgt 的值,我应该从哪里获得?
  • 我正在查看我的注册表格,如果我要保存新记录或注册新成员,我不知道应该向 lft 和 rgt 插入什么值
  • 就像我说的,@ashTon,这是一个复杂的话题。你需要阅读,理解它,做必要的案头工作和实验。再多的打字都不会教你这些东西,你需要学习它。举行有关嵌套集理论的教程超出了 Stack Overflow Q&A 的范围。你只需要做实际的工作来学习它。
  • @AdamCameron:或者只是深度优先遍历?为什么这么复杂?
  • @Phpdna 你能用足够多的词,这样你就不必在你的脑海里知道你在说什么了? ;-) 你可以在评论中使用 500 多个字符:不要害怕使用它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 2012-09-18
  • 2013-05-09
  • 1970-01-01
  • 2016-11-18
相关资源
最近更新 更多