当前位置: 首页 > 面试题库 >

递归MySQL查询?

琴修为
2023-03-14
问题内容

我有一组按层次结构组织的数据,应该可以增长到任意大小。我需要检索整个树,但是我无法弄清楚如何仅使用SQL来完成。我当前的解决方案是创建一个临时表,并使用递归函数依次查询树的分支,然后将结果存储在临时表中,随后我再次对其进行查询以产生所需的结果。

我的问题是,从本质上讲,我正在执行的联接正确吗?构造一个中间表,然后查询结果。似乎应该有一种使用联接的方法,但是MySQL文档仅涵盖检索有限深度的树的一部分。有没有办法做到这一点?我正在用PHP做到这一点。


问题答案:

MySQL不支持递归查询。

我建议您看一下比尔·卡文(Bill Karwin)的演讲,他在演讲中比较了存储分层数据的四种不同模型,并探讨了它们的优缺点:

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

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

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



 类似资料:
  • 问题内容: 考虑一个这样的表: 其中存储了一个简单的目录结构。如何通过单个SELECT查询获得目录的所有子目录? 问题答案: 可以,但是您需要更改数据库结构;进行更改后,您可以在一个查询中检索任意深度的树。查询稍微复杂一些,但是仍然非常简单。 在数据库(SitePoint)中存储分层数据 -本文是分步进行的,非常清楚。 在MySQL中管理分层数据 -与上述内容不同。

  • 问题内容: (希望)对某些人来说,这是一个非常简单的问题。 我有一个来自mySQL数据库的递归菜单,现在我的主要问题是: 创建URL的最佳方法是什么?我希望输入每行的标题,例如/ eggs / milk / bacon /。鸡蛋处于0级,例如:鸡蛋0,牛奶1,培根2。关于如何动态输出此内容的任何想法? 对于“ cletus”所说的这个问题,我几乎要去做些评论:PHP / MySQL- 建立导航菜单

  • 问题内容: 我有一个MySQL表,如下所示: 现在,我想有一个简单的MySQL查询,只需向其提供ID [例如说id=19],然后就应该获取其所有子ID [即结果应具有ID ‘20,21,22’]…。 孩子的等级未知;它可能会有所不同.... 我知道如何使用for循环…但是如何使用单个MySQL查询实现相同的目标? 问题答案: 对于MySQL 8+:使用递归with语法。 对于MySQL 5.x:使

  • 问题内容: 如何在MySql中运行此查询? 它会显示如下错误消息: 问题答案: 该语句/方法适用于PostgreSQL和Sybase(我想可能还有更多),所以也许您可以看一下: http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html 它应该向您展示一些使用MySQL的方法(以及PHP中的一两个方法,我只知道它不在您的标签列

  • 问题内容: 我有一个类似(简化)的表结构: 内容 content_has_content topic_has_content 任何主题都可以具有多个“内容”,任何“内容”都可以具有多个“子内容”(内容实例)。对于给定的id_topic,我想从链接的内容,子内容,子内容的子内容等中接收所有my_string1的列表。 我了解“ WITH”不适用于mysql,但找不到很好的递归替代方法。 谢谢丹尼尔

  • 我有一个MySQL表,如下所示: 现在,我想有一个MySQL查询,我只需向它提供id(例如),然后我应该获得它的所有子id(即,结果应该有id'20、21、22']... 不知道孩子的等级;它可以变化.... 我知道如何使用循环来实现...但是如何使用单个MySQL查询实现相同的功能呢?