Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database perl中对数据库的递归调用_Database_Perl_Recursion_Self Reference - Fatal编程技术网

Database perl中对数据库的递归调用

Database perl中对数据库的递归调用,database,perl,recursion,self-reference,Database,Perl,Recursion,Self Reference,我知道有一种简单的方法可以做到这一点,但是我的递归能力已经不适用了。给定一个包含三个字段的数据库表: id label child_id 我应该能够组合一个递归函数,它将给出如下输出: child (input of program) parent1 parent2 grandparent1 great-grandparent1 grandparent2 grandparent3 parent3 grandparent4 gran

我知道有一种简单的方法可以做到这一点,但是我的递归能力已经不适用了。给定一个包含三个字段的数据库表:

id
label
child_id
我应该能够组合一个递归函数,它将给出如下输出:

child (input of program)
  parent1
  parent2
    grandparent1
      great-grandparent1
    grandparent2
    grandparent3
  parent3
    grandparent4
    grandparent5
table parents

id    child_id    label
 1     NULL       child
 2     1          parent1
 3     1          parent2
 4     1          parent3
 5     3          grandparent1
 6     3          grandparent2
 7     3          grandparent3
 8     5          great-grandparent1
 9     4          grandparent4
10     4          grandparent5
我知道这应该很容易,但我不能让我的大脑通过心理体操来让它工作。还有,这是一件好事吗?看起来我可能会留下很多数据库连接

我想这是让我感到困难的部分。我从一个孩子的身份证开始,一路往上爬。一个孩子可以有很多父母。因此,输出将是树的“根”处的子id,然后是每个分支的父级和祖级。我越想,这只是传统的“单亲,多祖父母”的公式,除了语义。我可能只是想得太多了

该表的外观如下所示:

child (input of program)
  parent1
  parent2
    grandparent1
      great-grandparent1
    grandparent2
    grandparent3
  parent3
    grandparent4
    grandparent5
table parents

id    child_id    label
 1     NULL       child
 2     1          parent1
 3     1          parent2
 4     1          parent3
 5     3          grandparent1
 6     3          grandparent2
 7     3          grandparent3
 8     5          great-grandparent1
 9     4          grandparent4
10     4          grandparent5
你可以这样试试

sub getChildren {
  my $id = shift;
  my $depth = shift;
  my $sql = qq/SELECT id,label,child_id FROM table WHERE id=?/;
  my $sth = $db->prepare($sql);
  my $sth->execute($id);
  while(my ($id,$label,$child_id)=$sth->fetchrow_array) {
    print " "x$depth,$label;
    getChildren($child_id,$depth++);
 }
}
getChildren($id);

实际上,我在我的博客中解释了一个非常类似的问题,以及我使用perl解决这个问题的方法

如果您的数据库不支持存储过程,您可以在客户端执行相同的操作,但需要首先获取整个表并在内存中执行


当然,您可以递归地执行此操作,并在执行过程中获取每个条目,但由于SQL语句开销(SQLite上可能除外),它不会扩展。如果性能不是一个问题,那么这肯定是迄今为止最简单的解决方案。

您根据什么标准嵌套输出?您知道,我遗漏了一个重要部分(我认为,这一部分让我感到困惑)。我从一个孩子的身份证开始,一路往上爬。一个孩子可以有很多父母。因此,输出将是树“根”处的子id,然后是每个分支的父级和祖级id。表有多大?与调用数据库相比,将其加载到数据结构并在内存中执行可能要容易得多。内存不足是一个问题吗?在我看来,通常最好使用具有ID、Label、ParentID的表结构(根节点/记录的ParentID应为null/zero)。递归函数应接受1个参数:ParentID。循环遍历结果集,将ID传递给递归Fcn。从逻辑上讲,如果没有子记录(即,没有具有此父ID的记录),则不会递归。当然,如果您的查询通过分组来计算子节点的数量,并且在计数为零时甚至不递归,则效率更高。label2是label1的子节点还是父节点?label1是否有label2的子id,还是相反?我最初以为label2是label1的孩子,但你的“一个孩子有很多父母”让我感到困惑和反思。一个很好的例子,数据很有用。这正是我想做的,但出于某种原因,我试图使用全局美元深度。如果你读了我上面的笔记,我实际上是从孩子们开始的,但我认为同样的概念也适用。你只需要准备一次陈述。或者使用prepare_cached()。$depth计数器会一直计数,即使出于某种原因它应该重置。我认为前缀在这里更合适(++$depth),但无论哪种方式,它都有相同的问题。没关系,把它弄明白。$depth++incrementor需要位于while循环之外。