2012-11-30 2 views
2

나는 이것을 해결하려고하는 몇 가지 문제에 직면 해있다. 나는 계좌 차트를 가지고 있으며 돈 칼럼을 요약하려고합니다.Mysql/PHP - 계정 차트 - 부모 계정의 요약

category_table 
- id 
- parent_id 
- category 

이 ** 내가 계정 차트 얼마나 깊은 모른다 : 내 테이블 '범주'자동 relathionsip 있습니다. 그것은 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 
------------------------------- 

내가 무엇을 가지고 : 나는 PHP에서이 재귀 함수를 시도했습니다

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

하지만, 작동하지 않음 =/

(210)
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

당신의 함수를 사용해 보았지만 도움이되지 않았습니다 ... 아마 당신의 견해를 이해하지 못했을 것입니다. –

관련 문제