2012-11-30 120 views
2

我正面臨一些麻煩,試圖解決此問題。我有一個帳戶圖表,我想總結一下錢的專欄。我的表「類別」有一個自動relathionsip:Mysql/PHP - 帳戶圖表 - 總帳在父帳戶

category_table 
- id 
- parent_id 
- category 

**我不知道帳戶圖表有多深。它可以有1,2,3,4,5 ...多個級別。

下面是一個例子:

我想:

Category Name   |$ 
------------------------------- 
Category 1    |160.00 
    Category 1.1  |130.00 
     some expense | 50.00 
     some expense | 80.00 
    Category 1.2  | 30.00 
     some expense | 10.00 
     some expense | 20.00 
------------------------------- 
Category 2    |160.00 
    Category 2.1  |150.00 
     some expense |100.00 
     some expense |150.00 
    Category 2.1  | 70.00 
     some expense | 50.00 
     some expense | 20.00 
------------------------------- 

我有什麼:

Category Name   |$ 
------------------------------- 
Category 1    | 0.00 
    Category 1.1  | 0.00 
     some expense | 50.00 
     some expense | 80.00 
    Category 1.2  | 0.00 
     some expense | 10.00 
     some expense | 20.00 
------------------------------- 
Category 2    | 0.00 
    Category 2.1  | 0.00 
     some expense |100.00 
     some expense |150.00 
    Category 2.1  | 0.00 
     some expense | 50.00 
     some expense | 20.00 
------------------------------- 

我試圖在PHP這個遞歸函數,但它沒有工作=/

function display_children($parent) { 
    $sql = "SELECT c.id, c.category, 
        (SELECT COUNT(*) FROM category c1 WHERE c1.parent_id = c.id) As Total, 
        (SELECT SUM(p.value) FROM payables p WHERE p.category_id = c.id) As TotalToPay 
      FROM category c 
      WHERE c.parent_id = {$parent} 
      ORDER BY c.category"; 
    $result = mysql_query($sql); 
    $ret = "<ul>"; 
    $totalcategory = 0; 
    while ($row = mysql_fetch_assoc($result)) { 
     if ($row['Total'] > 0) { 
      $totalcategory = $totalcategory + (empty($row['TotalToPay']) ? 0 : $row['TotalToPay']); 
      $ret .= "<li><a href='#" . $row['id'] . "'>" . $row['category'] . " - " . $totalcategory . "</a>"; 
      $ret .= display_children($row['id']); 
      $ret .= "</li>"; 
     } elseif ($row['Total']==0) { 
      $totalcategory = ($totalcategory + empty($row['TotalToPay']) ? 0 : $row['TotalToPay']); 
      $ret .= "<li><a href='" . $row['id'] . "'>" . $row['category'] . " - " . $totalcategory . "</a></li>"; 
     } else; 
    } 
    $ret .= "</ul>"; 
    return $ret; 
} 
echo display_children(0); 

這表明我:

Category 1 - 0 
    Category 1.1 - 0 
    Category 1.2 - 0 
     expense 1 - 25.90 
     expense 2 - 0 
     expense 3 - 3.80 
Category 2 - 0 
    Category 2.1 - 0 
    Category 2.2 - 0 
    Category 2.3 - 0 
Category 3 - 0 
    Category 3.1 - 52.00 

...任何想法? ...謝謝:)

+1

向我們展示您嘗試的遞歸函數。 – Kermit

+0

我編輯了問題 –

回答

0

如果你有一個最大深度像3你可以用這樣一個查詢做到這一點:

SELECT c1.dollar + c2.dollar2 + c3.dollar AS dollar_sum 
FROM category_table c1 
LEFT JOIN category_table c2 ON c1.id = c2.parent_id 
LEFT JOIN category_table c3 ON c2.id = c3.parent_id 

,如果你不知道你的層次結構的最大深度你確實可以像這樣在php中使用recusrive功能

function getSum($parent = null) { 


    if ($parent === null) { 

     $rows = // SELECT id, dollar FROM category_table WHERE parent_id IS NULL; 

    } else { 

     $rows = // SELECT id, dollar FROM category_table WHERE parent_id = $parent; 
    } 

    foreach ($rows as &$row) { 

     $children = getSum($row->id); 
     foreach ($children as $child) { 

      $row->dollar += $child->dollar; 
     } 
    } 

    return $rows; 
} 
+0

感謝您的回覆..但我不知道帳戶圖表有多深。它可以有多個層次。 =/ –

+0

我會嘗試你的遞歸函數,然後在這裏發佈結果.. 謝謝.. –

+0

我試過使用你的函數,但它沒有幫助我...也許我不明白你的觀點。 –