我正在阅读此链接managing hierarchical data in mysql因为我在做MLM项目。这个例子说明了这一点。
但我在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`)
)
请提前帮助我。
答案 0 :(得分:0)
尝试在查询中删除“and parent.parent.id = 1”。数据是嵌套的a.k.a celko树。
答案 1 :(得分:0)
最初要做的最好的事情是阅读Joe Celko关于" Trees in SQL"的文章,以及一般的嵌套集理论(维基百科做得很合理:&#34 ; Nested set model&#34)。它需要一些练习和反思才能掌握它。
您似乎首先误解的是左/右值与键值无关,它们是完全独立的实体。他们所做的是 - 相互协调 - 反映数据的层次结构。
节点的左/右值定义其后代节点的左/右值的边界。以示例代码为例:Flash
是MP3 Players
的后代,因为它的左/右都在MP3 Player's
左/右定义的范围内。 Simialrly all 后续节点是Electronics
的后代,因为它们的所有左/右值都在其左/右范围内。
相反,给定节点的祖先是左/右值完全落在所讨论的节点左/右的节点。 Electronics
是Flash
的祖先,因为范围1-20在12-13范围之外(或周围)。
具有相邻左/右值的节点 - 如Flash
- 隐式没有后代:后代的宽度没有宽度适合。
嵌套集非常快速地获取所有祖先或所有后代,但在获取直接父母,孩子或兄弟姐妹方面不是那么出色。为此,有时包含parent
值也很好,该值表示父节点的 ID 。所以我们在那里有一个混合嵌套的set / adjacency list模型。维护树有更多的开销(C_UD,而不是R操作),但在Web环境中,读取数量级的压倒性写入,所以这通常没问题。
您的基本问题似乎是您认为left
/ right
值与记录ID
值相关,而不是。{/ p>
阅读这些文章,并对您的数据做一些检查,它应该开始有意义。但这并不是完全直截了当的,所以给自己一些时间。
使用嵌套集的一个警告:了解层次结构的反映方式只是其中的一部分。您还需要了解阅读祖先,后代,父母,孩子,兄弟姐妹所需的操作;并且还需要了解添加/更新/删除节点所需的算法。这些都是非平凡的,还需要进一步阅读。但对这些问题的解释超出了这个问题的范围。