为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以通过单个查询在MySQL中查询树结构表到任何深度?

是否可以通过单个查询在MySQL中查询树结构表到任何深度?

开满天机 2019-10-28 10:25:50
我认为答案是否定的,但是我很喜欢它,任何人都可以深入了解如何在SQL(MySQL)中将树结构爬网到任何深度,而只需一个查询更具体地说,给定一个树形结构的表(id,数据,数据,parent_id)和表中的一行,是否有可能获得所有后代(子代/孙代/等等),或者所有祖先(父代/祖父母) / etc),而不用单个查询知道它会走多远?还是使用某种递归需求,在这里我不断进行更深入的查询,直到没有新结果为止?具体来说,我使用的是Ruby和Rails,但我猜这不太相关。
查看完整描述

3 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

我之前遇到过这个问题,并且有一个古怪的想法。您可以在每个记录中存储一个字段,该字段是直接祖先的ID一直串联到根的串联字符串。


想象一下,您有这样的记录(缩进意味着层次结构,数字是id,祖先。


1,“ 1”

2,“ 2,1”

5,“ 5,2,1”

6,“ 6,2,1”

7,“ 7、6、2、1”

11,“ 11,6,2,1”

3,“ 3,1”

8,“ 8、3、1”

9,“ 9,3,1”

10,“ 10,3,1”

然后选择id:6的后代,只需执行此操作


SELECT FROM table WHERE ancestors LIKE "%6,2,1"

使祖先列保持最新状态可能比给您带来更多麻烦,但这对任何数据库都是可行的解决方案。


查看完整回答
反对 回复 2019-10-28
?
慕标5832272

TA贡献1966条经验 获得超4个赞

当您要问的主要问题是“我所有的孩子是什么”和“父母全部是什么”时,Daniel Beardsley的答案根本不是一个糟糕的解决方案。


作为对Alex Weinstein的回应,与Celko技术相比,此方法实际上导致对父级运动上的节点的更新更少。在Celko的技术中,如果最左边的2级节点移动到最右边的1级节点之下,则树中几乎每个节点都需要更新,而不仅仅是节点的子节点。


但是我要说的是,丹尼尔可能会以错误的方式将路径存储回根。


我会存储它们,以便查询将


SELECT FROM table WHERE ancestors LIKE "1,2,6%"

这意味着mysql可以使用“祖先”列上的索引,而前导%则无法做到这一点。


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 1101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信