Php 递归MySQL查询?

Php 递归MySQL查询?,php,mysql,recursion,tree,infinite,Php,Mysql,Recursion,Tree,Infinite,我有一组按层次组织的数据,这些数据应该能够增长到任意大小。我需要检索整个树,但我不知道如何仅使用SQL。我目前的解决方案是创建一个临时表,并使用递归函数连续查询树的分支,然后将结果存储在临时表中,随后我再次查询该临时表以生成所需的结果 我的问题是,我所做的基本上就是连接的正确性?构造一个中间表,然后查询结果。似乎应该有一种方法可以通过连接来实现,但是MySQL文档只涵盖了在有限深度内检索树的一部分。有办法做到这一点吗?我是用PHP实现的。MySQL不支持递归查询 我建议您看看Bill Karwi

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


我的问题是,我所做的基本上就是连接的正确性?构造一个中间表,然后查询结果。似乎应该有一种方法可以通过连接来实现,但是MySQL文档只涵盖了在有限深度内检索树的一部分。有办法做到这一点吗?我是用PHP实现的。

MySQL不支持递归查询

我建议您看看Bill Karwin,他比较了四种不同的存储继承人档案数据的模型,并分析了它们的优缺点:

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


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

需要更多数据。。该表是仅表示一棵树还是多棵树?如果是一棵树,您可以从表中选择所有内容,然后在内存中构建树结构。如果是多棵树,可以考虑将树型ID添加到每个树元素中来表示元素所属的树。p>

如果你要选择一个树的分支,你可以考虑用连续的整数“排序秩”存储元素,并链接到左右节点,然后选择最左边的节点和最右边的节点的整数范围内的所有节点。p>


有关此存储模型的详细信息,请查阅邻接列表。您还可以创建一个混合邻接列表/父节点链接,因为数据存储非常便宜,但更新排序链接可能会带来更多开销…

MySQL不支持分层/递归查询。我问的类似问题可能会有所帮助:Karwin的SQL反模式书很好地阅读了这类内容。谢谢,那是一本很棒的书。嵌套集最终是一个理想的解决方案,尽管它使SQL变得有些复杂。此外,我曾考虑过获取整个表,但我还需要能够获取特定的分支。