2012-04-04 23 views
3

Ich habe eine Tabelle mit Daten gespeichert hierarchicaly Adjazenzliste mit wie im folgenden Beispielrekursive Summe in Abfrage

 
id  account parent 
1  root null 
2  a1  1 
3  b1  1 
4  a2  2 
5  a3  4 
6  a4  2 
7  b2  3 

und einem Tisch, wo ich Werte halten für diese Konten

 
id_account value 
2    10 
2    10 
4    20 
5    30 
6    10 

Ich machte ein Funktion, die alle Kinderkonto gibt ein Hauptkonto angegeben:

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; 
    } 

Was ich versuche ist zu tun Funktion, die nicht nur Kinderkonten zurückgibt, sondern auch die Summe aller Werte einschließlich Kinder jedes Ergebnisses. Zum Beispiel

getChildrenAccount(4) 

Würde eines Array mit folgenden Syntax zurückgeben

 
array(1) { 
    [0]=> array(3) { 
    ["id"]=> 5 
    ["account"]=> "a3" 
    ["sum"]=> 50 //a2 + a3 
} 

Und

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 
} 

ich glaube, ich in meiner während Aussage eine Art von Rekursion zu verwenden, habe aber Ich bin etwas durcheinander. Kannst du mir bitte helfen?

Dank

Antwort

0

Ich fand eine Funktion, die Ergebnisse ohne rekursive Abfragen wie erforderlich erhält.

$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

Ich nehme an, Ihr Code funktioniert nur mit einer Verschachtelungsebene, aber ich brauche etwas, das für mehr als eine Ebene funktioniert. –

0

Sie müssen über Ihr Ergebnis wiederholen, dann für jeden ID Aufruf getChildrenAccount für seine Eltern ID.

+0

Was ist mit der Summe? Ich möchte nicht alle IDs für verschachtelte Kinder, aber ich möchte die Summe ihrer Werte. –

+0

Nun ... ehrlich verstehe ich dein Beispiel nicht ganz (ich verstehe die tatsächliche Summenberechnung nicht - ich bekomme das generische Problem, "gib mir alle Kinderwerte N Ebenen runter", aber nicht das konkrete Beispiel). Wenn Ihr Array nur die unmittelbaren Kinder anzeigen soll, aber die Summe dieser unmittelbaren Kinder die Werte aller Nachkommen einschließen soll, dann würde ich zwei Funktionen vorschlagen - getChildrenAccount (die die Arrays erstellt) und getDescendentsSums (die den ganzen Weg zurückführt) runter und bekommt nur die Summenwerte). – Aerik

+0

Ja, wie du erwähnt hast, möchte ich nur die unmittelbaren Kinder zeigen, aber die Summe aller Nachkommen. Ich werde versuchen, Ihren Ansatz mit zwei Funktionen zu codieren –