2012-04-04 5 views
3

У меня есть таблица с данными, хранящимися hierarchicaly с использованием списка смежности, как в следующем примереРекурсивный сумма в запросе

 
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 
} 

Я думаю, что я должен использовать какой-то рекурсии в моем в то время как заявление, но Я немного смущен. Не могли бы вы мне помочь?

Благодаря

ответ

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); 
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) '; 
.... 
} 
+0

Я предполагаю, что ваш код работает только с одним уровнем вложенности, но мне нужно что-то, что работает более чем на один уровень. –

0

Вы должны перебрать ваш результат, то для каждого идентификатор вызова getChildrenAccount для родительского идентификатора.

+0

Как насчет суммы? Я не хочу, чтобы все идентификаторы для вложенных детей, но мне нужна сумма их значений. –

+0

Ну ... честно говоря, я не совсем понимаю ваш пример (я не понимаю фактическое вычисление суммы - я получаю общую проблему, «дайте мне все значения N детей вниз», но не конкретный пример). Если вы хотите, чтобы ваш массив показывал только непосредственные дети, но суммы этих непосредственных детей включали значения всех потомков, я бы предложил две функции: getChildrenAccount (которая строит массивы) и getDescendentsSums (которая полностью повторяется) вниз и просто получает значения суммы). – Aerik

+0

Да, как вы упомянули, я хочу показать только непосредственных детей, но сумма всех потомков. Я попытаюсь скомпоновать ваш двухфункциональный подход –

Смежные вопросы