2

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

我的问题是,我所做的本质上是 join 正确吗?构造一个中间表,然后查询结果。似乎应该有一种方法可以通过连接来完成,但 MySQL 文档仅涵盖检索树的部分直到有限深度。有没有办法做到这一点?我在 PHP 中这样做。

4

2 回答 2

15

MySQL 不支持递归查询。

我建议您查看 Bill Karwin 的演示文稿,他在其中比较了四种不同的存储层级数据的模型,并查看了它们的优缺点:

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

幻灯片 48 显示了每种模型的某些类型查询的相对难度。从您的问题来看,您似乎对“查询子树”最感兴趣,邻接列表(您当前使用的模型)在这四个中表现最差。

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

于 2010-09-13T20:33:56.147 回答
1

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

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

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

于 2010-09-13T20:35:50.760 回答