代码之家  ›  专栏  ›  技术社区  ›  coding_hero

perl中对数据库的递归调用

  •  4
  • coding_hero  · 技术社区  · 14 年前

    id
    label
    child_id
    

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

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

    我知道这应该很容易,但我不能让我的思想通过心理体操使它工作。还有,这是件好事吗?看来我可能会留下很多数据库连接。

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

    桌子看起来像这样:

    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
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Toto    14 年前

    你可以这样试试

    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);
    
        2
  •  0
  •   Robin Smidsrød    14 年前

    Implementing a depth first search in a PostgreSQL stored procedure ,以及我使用perl解决这个问题的方法。

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