我知道有一种简单的方法可以做到这一点,但我的递归能力已经不合时宜了。给定一个包含三个字段的数据库表:
id
label
child_id
我应该能够组合一个递归函数,它将提供如下输出:
child (input of program)
parent1
parent2
grandparent1
great-grandparent1
grandparent2
grandparent3
parent3
grandparent4
grandparent5
我知道这应该很容易,但是我无法通过心理体操让它发挥作用。此外,这是一件好事吗?好像我最终可能会打开相当多的数据库连接。
我认为这是让我感到困难的部分。我从一个child_id开始,然后继续努力。一个孩子可以有很多父母。因此,输出将是树的“根”处的子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
答案 0 :(得分:3)
你可以尝试这种方式
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);
答案 1 :(得分:0)
我实际上在我的博客Implementing a depth first search in a PostgreSQL stored procedure中解释了一个非常类似的问题,以及我使用perl解决这个问题的方法。
如果您的数据库不支持存储过程,您可以在客户端执行相同的操作,但您需要先获取整个表并在内存中执行。
你当然可以递归地执行它并随着时间的推移获取每个条目,但由于SQL语句开销(除了可能在SQLite上)它不会扩展。如果性能不是问题,那么这必须是迄今为止最简单的解决方案。