2010-09-13 131 views
2

我有一组分层次组织的数据,应该能够增长到任意大小。我需要检索整个树,但我无法弄清楚如何用SQL来完成。我目前的解决方案是创建一个临时表并使用递归函数连续查询树的分支,然后将结果存储在临时表中,随后我再次查询以产生我想要的结果。递归MySQL查询?

我的问题是,我在做什么基本上是什么一个连接不正确?构建一个中间表,然后查询结果。似乎应该有一种方法来处理连接,但MySQL文档仅涵盖检索树的部分,直到有限的深度。有没有办法做到这一点?我在PHP中这样做。

+0

MySQL没有分层/递归查询支持。 – 2010-09-13 20:32:51

+0

类似的问题我问,可能会有一些帮助:http://stackoverflow.com/questions/2352543/implementing-recursive-comments-in-php-mysql – GSto 2010-09-13 20:39:00

回答

15

MySQL不支持递归查询。

我建议你看看比尔Karwin的presentation他比较了四种不同的型号,用于存储heirarchical数据,并着眼于他们的优点和缺点:

  • 邻接表
  • 路径枚举
  • 嵌套集合
  • 关闭表

幻灯片48显示了相对每个模型的某些类型的查询都很困难。从你的问题来看,这听起来像你最感兴趣的是“查询子树”,对此,邻接列表(你当前使用的模型)在四个中表现最差。

或者,如果您只想选择整个树(如表中的所有数据),则可以使用简单查询SELECT * FROM yourtable并重新构建客户端中的树结构。

+1

Karwin的* SQL反模式*书是一个很好的阅读关于这种的东西。 – 2010-09-13 20:39:49

+0

谢谢,这是一个伟大的阅读。嵌套集最终成为理想的解决方案,尽管它在某种程度上使SQL复杂化了。 – 2010-09-20 05:01:30

+0

此外,我曾想过抓住整个桌子,但我需要能够抓住特定的分支。 – 2010-09-20 05:01:50

1

需要更多的数据..表只表示一棵树或多棵树吗?如果它是一棵树,则可以从表中选择所有内容,然后在内存中构建树结构。如果它是多个树,则可以考虑为每个树元素添加一个treeID来表示该元素所属的树。

如果您正在寻找选择树的分支,您可以考虑使用顺序整数“排序等级”存储元素并链接到左右节点,然后选择最左节点的整数范围内的所有节点和最右边的节点。

查找邻接列表以获取有关此存储模型的更多信息。您还可以创建一个混合邻接列表/父节点链接,因为数据存储是如此便宜,但您可能有更多开销保持排序链接更新...