我有一组按层次组织的数据,应该能够增长到任意大小。我需要检索整个树,但是我不知道如何仅使用SQL来实现。我目前的解决方案是创建一个临时表,并使用递归函数连续查询树的分支,然后将结果存储在临时表中,我随后再次查询临时表以产生我想要的结果。
我的问题是,我所做的本质上是连接所正确做的?构造一个中间表,然后查询结果。看起来应该有一种使用joins的方法,但MySQL文档只涵盖了检索树的有限深度的部分。有没有办法做到这一点?我用PHP做这件事。
发布于 2010-09-14 04:33:56
MySQL不支持递归查询。
我建议你看看Bill Karwin的presentation,他比较了四种不同的存储层级结构数据的模型,并分析了它们的优缺点:
幻灯片48显示了使用每个模型进行某些类型的查询的相对难度。从你的问题看,你似乎对“查询子树”最感兴趣,对于“查询子树”,邻接表(你当前使用的模型)在四个模型中执行得最差。
或者,如果只想选择整个树,就像选择表中的所有数据一样,那么可以使用简单的查询SELECT * FROM yourtable并在客户机中重新构建树结构。
发布于 2010-09-14 04:35:51
需要更多数据..该表是只表示一棵树,还是表示多棵树?如果是一棵树,您可以从表中选择所有内容,然后在内存中构建树结构。如果是多个树,您可以考虑为每个树元素添加一个treeID,以表示该元素所属的树。
如果要选择树的一个分支,可以考虑存储具有顺序整数“排序等级”和指向左右节点的链接的元素,然后选择最左侧节点和最右侧节点整数范围内的所有节点。
有关此存储模型的详细信息,请查看邻接列表。您还可以创建混合邻接列表/父节点链接,因为数据存储非常便宜,但您可能会有更多的开销来保持排序链接的更新...
https://stackoverflow.com/questions/3704130
复制相似问题