因此,我正在创建一个系统,用户可以构建自己的组织结构,这意味着所有组织都可能会有所不同。
我的设置是组织由不同的部门组成。在我的division
表中,我有一个名为parent_id
的值,指向一个当前分部为父的部门。
设置可能看起来像这样(绘图)
从图纸中可以看到division
2和3是division
1的孩子,因此它们都具有值parent_id = 1
分区4是id为2的孩子,有两个孩子(5& 6)
现在到了棘手的部分,因为我的系统中的结构我需要根据根节点访问我系统中的所有孩子和孩子的孩子。
例如,如果我想知道division
1的所有孩子,结果应为[2,3,4,5,6]
现在我的问题是。我怎样才能找到所有孩子?
起初我觉得这样的事情
root = 1;
while(getChildren(root) != null)
{
}
function getChildren(root)
{
var result = 'select * from division where parent_id = '+root;
if(result != null)
{
root = result;
}
return result;
}
请注意,这只是使用while循环来浏览列表的示例
但是,当语句的结果返回两个子项
时,这将不起作用所以我的问题是如何通过上述设置找到所有root id的所有孩子?
答案 0 :(得分:0)
您可以使用递归函数。小心,并跟踪你找到的孩子,所以如果你再次遇到它们就会停止并出错 - 否则你将陷入无限循环。
我不知道你使用的语言是什么,所以这里有一些伪代码:
create dictionaryOfDivisions
dictionaryOfDivisions.Add(currentDivision)
GetChildren(currentDivision)
Function GetChildren(thisDivision) {
theseChildren = GetChildrenFromDB(thisDivision)
For each child in theseChildren
If dictionaryOfDivisions.Exists(child)
'Oops, here's a loop! Error
Exit
Else
dictionaryOfDivisions.Add(child)
GetChildren(child)
End If
Next
}