php - Mysql/PHP - 账户图表 - 父账户中的汇总

标签 php mysql relationship hierarchical-data

我在尝试解决这个问题时遇到了一些麻烦。我有一个帐户图表,我想汇总货币栏。我的表“类别”有一个自动关系:

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

...有什么想法吗? ...谢谢 :)

最佳答案

如果你有一个像 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 中使用递归函数

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

关于php - Mysql/PHP - 账户图表 - 父账户中的汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649239/

相关文章:

php - 使用mysql如何统计成功DR的数量?

php - 通过准备好的语句使用 INSERT INTO 的 PDO

python - 如何获取一列中所有唯一的值组合,这些值在另一列中

php - 你可以通过这种方式让我的生活变得更轻松吗? (庞大的代码库和补丁问题)

php - 将字符串拆分为自定义格式

mysql - MySQL临时变量可以用在WHERE子句中吗?

redis - 如何与Redis设计 "Following"关系

neo4j - 使用 NEO4j 显示具有多个关系的节点

php - 自动用 "<br>"替换 html 标签

php - 从数据库查询结果运行 PHP 代码