3

次の例のように、隣接リストを使用してデータが階層的に格納されたテーブルがあります

idアカウントの親
1 ルートヌル
2 a1 1
3 b1 1
4 a2 2
5 a3 4
6 a4 2
7 b2 3

そして、これらのアカウントの値を保持するテーブル

id_account 値
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)

次の構文で配列を返します

配列(1) {
  [0]=>配列(3) {
     ["ID"]=> 5
     ["アカウント"]=> "a3"
     ["合計"]=> 50 //a2 + a3
}

getChildrenAccount(2)
配列(2) {
  [0]=>配列(3) {
     ["id"]=> 4
     ["アカウント"]=> "a2"
     ["合計"]=> 70 //a1 + a2 + a3
  [1]=>配列(3) {
     ["ID"]=> 6
     ["アカウント"]=> "a4"
     ["合計"]=> 30 //a1 + a4
}

while ステートメントで何らかの再帰を使用する必要があると思いますが、少し混乱しています。助けてください。

ありがとう

4

3 に答える 3

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) ';
....
}
于 2012-04-04T06:01:28.797 に答える
0

結果を反復処理する必要があり、各 ID に対して親 ID の getChildrenAccount を呼び出します。

于 2012-04-04T17:25:29.860 に答える
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);
于 2012-04-10T02:16:42.257 に答える