我有一组按层次组织的数据,应该能够增长到任意大小。我需要检索整个树,但我无法弄清楚如何只使用SQL。我目前的解决方案是创建一个临时表并使用递归函数连续查询树的分支,然后将结果存储在临时表中,我随后再次查询以生成我想要的结果。
我的问题是,我正在做的基本上是一个连接是正确的吗?构造一个中间表,然后查询结果。似乎应该有一种方法来使用连接,但MySQL文档仅涵盖检索树的部分到有限深度。有没有办法做到这一点?我在PHP中这样做。
答案 0 :(得分:15)
MySQL不支持递归查询。
我建议您查看Bill Karwin的presentation,在那里他比较了四种不同的存储层次数据的模型并查看它们的优缺点:
幻灯片48显示了每种模型的某些类型查询的相对难度。从您的问题来看,您最感兴趣的是“查询子树”,其中邻接列表(您当前使用的模型)在四个中表现最差。
或者,如果您只想选择整个树,就像在表中的所有数据中一样,那么您可以使用简单查询SELECT * FROM yourtable
并在客户端中重建树结构。
答案 1 :(得分:1)
需要更多数据..表只代表一棵树,还是多棵树?如果它是单个树,您可以从表中选择所有内容,然后在内存中构建树结构。如果它是多个树,您可以考虑向每个树元素添加一个treeID,以表示该元素所属的树。
如果您要选择树的分支,可以考虑使用顺序整数“排序等级”存储元素,并链接到左侧和右侧节点,然后选择最左侧节点的整数范围内的所有节点,最正确的节点。
查找邻接列表以获取有关此存储模型的更多信息。您还可以创建混合邻接列表/父节点链接,因为数据存储非常便宜,但是您可能会有更多的开销来保持排序链接更新......