我有一个表,其数据存储使用邻接列表,如下例所示
id account parent 1 root null 2 a1 1 3 b1 1 4 a2 2 5 a3 4 6 a4 2 7 b2 3
我保留这些帐户值的表格
id_account value 2 10 2 10 4 20 5 30 6 10
我创建了一个函数,该函数返回给定父帐户的所有子帐户:
function getChildrenAccount($parent_id)
{
$query = "SELECT id, account FROM accounts WHERE parent='{$parent_id}' ORDER BY account";
$result = mysql_query($query) or die(mysql_error());
while($r[]=mysql_fetch_assoc($result));
return $r;
}
我正在尝试做的是一个函数,它不仅返回子帐户,还返回所有值的总和,包括每个结果的子项。例如
getChildrenAccount(4)
将返回具有以下语法的数组
array(1) { [0]=> array(3) { ["id"]=> 5 ["account"]=> "a3" ["sum"]=> 50 //a2 + a3 }
并且
getChildrenAccount(2)
array(2) { [0]=> array(3) { ["id"]=> 4 ["account"]=> "a2" ["sum"]=> 70 //a1 + a2 + a3 [1]=> array(3) { ["id"]=> 6 ["account"]=> "a4" ["sum"]=> 30 //a1 + a4 }
我想我必须在我的while语句中使用某种递归但我有点困惑。你能帮帮我吗?
由于
答案 0 :(得分:0)
function getChildrenAccount($accountID){
$query = ' SELECT id,account,sum(value) as `SUM`
FROM accounts,accountsValues
WHERE accounts.id = accountsValues.id_accounts
AND id = $accountID
OR id IN (SELECT id FROM accounts where parent = $accountID) ';
....
}
答案 1 :(得分:0)
您需要迭代结果,然后为每个id调用getChildrenAccount作为其父ID。
答案 2 :(得分:0)
我找到了一个在没有递归查询的情况下根据需要获得结果的函数。
$nodeList = array();
$tree = array();
$query = mysql_query("SELECT A.guid, A.name, A.parent_guid, SUM( S.value_num ) /100 AS suma FROM accounts AS A
LEFT JOIN splits AS S ON S.account_guid = A.guid GROUP BY A.guid ORDER BY A.name");
while($row = mysql_fetch_assoc($query))
$nodeList[$row['guid']] = array_merge($row, array('children' => array()));
mysql_free_result($query);
foreach ($nodeList as $nodeId => &$node) {
if (!$node['parent_guid'] || !array_key_exists($node['parent_guid'], $nodeList))
$tree[] = &$node;
else
$nodeList[$node['parent_guid']]['children'][] = &$node;
}
unset($node);
unset($nodeList);