猿问

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

我认为答案是否定的,但是我很喜欢它,任何人都可以深入了解如何在SQL(MySQL)中将树结构爬网到任何深度,而只需一个查询


更具体地说,给定一个树形结构的表(id,数据,数据,parent_id)和表中的一行,是否有可能获得所有后代(子代/孙代/等等),或者所有祖先(父代/祖父母) / etc),而不用单个查询知道它会走多远?


还是使用某种递归需求,在这里我不断进行更深入的查询,直到没有新结果为止?


具体来说,我使用的是Ruby和Rails,但我猜这不太相关。


开满天机
浏览 1102回答 3
3回答

紫衣仙女

我之前遇到过这个问题,并且有一个古怪的想法。您可以在每个记录中存储一个字段,该字段是直接祖先的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"使祖先列保持最新状态可能比给您带来更多麻烦,但这对任何数据库都是可行的解决方案。

慕标5832272

当您要问的主要问题是“我所有的孩子是什么”和“父母全部是什么”时,Daniel Beardsley的答案根本不是一个糟糕的解决方案。作为对Alex Weinstein的回应,与Celko技术相比,此方法实际上导致对父级运动上的节点的更新更少。在Celko的技术中,如果最左边的2级节点移动到最右边的1级节点之下,则树中几乎每个节点都需要更新,而不仅仅是节点的子节点。但是我要说的是,丹尼尔可能会以错误的方式将路径存储回根。我会存储它们,以便查询将SELECT FROM table WHERE ancestors LIKE "1,2,6%"这意味着mysql可以使用“祖先”列上的索引,而前导%则无法做到这一点。
随时随地看视频慕课网APP
我要回答