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

使用MySQL查询遍历行以创建递归树

吕高寒
2023-03-14
问题内容

我有一个像这样设置的物料清单表:
item-parent

显示物料清单的最终结果是这样显示的:

item 1  - parent 0    
    item 2 - parent 1    
    item 3 - parent 1

最终结果也可能是多级的,如下所示:

item 3 - parent 0    
    item 4 - parent 3    
    item 76 - parent 3

它可以无限进行:

item 76 - parent 0    
    item 46 - parent 76

item 46 - parent 0     
    item 25 - parent 46

现在,我要么只是从数据库中获得1级:

SELECT * FROM bom WHERE parentId = $itemId (shorthand)

或从表中拉出每一行,并使用递归函数仅对所需行进行排序,但这显然效率不高,因为我可能只需要10行,但我拉出10,000条记录。递归函数的输出将只创建一个像这样的树:

item 1
   item 2
   item 3
      item 4
      item 76
         item 46
            item 25

我所知道的是,我从项目1开始。项目5的父级可以为11;项目5的父级可以为11。他们不必顺序进行。我想把所有的子树枝都放在树上。我如何在mysql中执行此查询?


问题答案:

早在2011年10月24日,有人 在DBA
StackExchange中
发布了一个
有关MySQL中的树遍历的问题

。MySQL的SQL无法支持它。

回答该问题时 我写下了三(3)个存储过程(
GetParentIDByID,GetAncestry和GetFamilyTree )。希望这些信息可以帮助您构建所需的内容。
****



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

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

  • 问题内容: 我有一组按层次结构组织的数据,应该可以增长到任意大小。我需要检索整个树,但是我无法弄清楚如何仅使用SQL来完成。我当前的解决方案是创建一个临时表,并使用递归函数依次查询树的分支,然后将结果存储在临时表中,随后我再次对其进行查询以产生所需的结果。 我的问题是,从本质上讲,我正在执行的联接正确吗?构造一个中间表,然后查询结果。似乎应该有一种使用联接的方法,但是MySQL文档仅涵盖检索有限深

  • 所以我在研究树遍历算法。例如,在K-d树遍历中,我们的目标是遍历节点直至叶子。这与其说是一个树搜索,不如说是一个根到叶的遍历。 在这种情况下,递归解决方案就足够了。但是,在C等语言中,递归调用函数需要将值推送到堆栈上,并在堆栈帧之间跳跃等。标准的递归方法类似于: 因此,考虑到二叉树有一个明确的上界(我相信这也可以扩展到其他树类型),以迭代方式执行此遍历是否更有效: 二叉树的最大高度是它的节点数,而

  • 问题内容: 情况:我有一个包含多个子对象和子子对象的大对象,其属性包含多个数据类型。为了我们的目的,该对象看起来像这样: 我需要遍历此对象并构建一个显示层次结构的键的列表,因此该列表最终看起来像这样: 我有这个函数,它确实遍历对象并吐出键,但不是按层次排列: 问题答案: 如果属性为原始类型,则我将存储一个字符串,然后将其输出:

  • 问题内容: 有没有一种方法(在jQuery或JavaScript中)循环遍历每个对象以及子对象和孙子对象等等? 如果是的话…我还能读他们的名字吗? 例: 所以循环应该做这样的事情… 问题答案: 您正在寻找循环: 请注意,循环将遍历任何可枚举的属性,包括那些添加到对象原型的属性。为了避免作用于这些属性,可以使用方法检查该属性是否仅属于该对象: 递归执行循环就像编写递归函数一样简单: