【问题标题】:Get sum from nodes tree从节点树中获取总和
【发布时间】:2016-09-14 05:55:35
【问题描述】:

我正在学习 php。 我有这个结构

company 1 - $10| all $50
-company 1.1 - $10| all $20
--company 1.1.1 - 10$| all $10
-company 1.2 - $20| all $20

每个公司可能有多个子公司,也可能只有一个父公司。每个公司都有钱。 所有公司都有 Allmoney - 自有资金 + 他所有子公司的资金。

在 MySQL 中这个结构是这样的

id|parent_id|name|money|allmoney
1| 0| company 1| 10|###
2| 1| company 1.1|10 |###
3| 2| company 1.1.1|10 |###
4| 1| company 1.2|10 |###

那么,我如何在 php 中计算每家公司的 allmoney?我现在,需要使用递归,但我尝试并没有任何事情不会发生。 SELECT、UPDATE 和其他命令 mysql - 我知道,请帮助我使用 php。 我写的是这样的:

function updatemoney($id)
    {
        $data = CS50::query("SELECT ...", $id);
        $allmoney = 0;

        if(count($data) > 0)
        {
            foreach($data as $row)
            {

                $allmoney += $row["cash"];
               //somewhere this, maybe need ubdate my db 
                $allmoney += updatemoney($row["id"]);
            }
        }
        else return 0;
    }

非常感谢

【问题讨论】:

    标签: php mysql recursion


    【解决方案1】:

    LTREE

    你几乎是在正确的轨道上。您几乎偶然发现了在数据库中存储分层数据的“LTREE”系统。您只需要稍作修改即可。就是这样。

    您的表格可能如下所示:

    CREATE TABLE Table1
        (`id` int, `parent_id` int, `name` varchar(13),
         `path` char(10),
         `money` int)
    ;
    

    您的数据可能如下所示。

    (1, 0, 'company 1', '1', 10),
    (2, 1, 'child 1', '1.1', 10),
    (3, 2, 'child 2', '1.1.1', 10),
    (4, 1, 'child 3', '1.2', 10,),
    (4, 1, 'company 2', '2', 10),
    (4, 1, 'child 2.1', '2.1', 10)
    

    路径列有助于识别哪个公司是另一家公司的子公司。请注意,您实际上并不需要有一个 allmoney 列。这是动态生成的。

    您如何找到属于第一家公司的所有资金?

    select sum(money) from Table1 where path >= '1' and path < '2'
    

    请注意,在我们创建的结构中,child1 是 child2 的父级。那么我们如何找到child1的所有钱呢?

    select sum(money) from Table1 where path >= '1.1' and path < '1.2'
    

    只有一个查询,没有递归。

    MPTT

    另一种获取分层数据的流行方法是使用修改的预排序树遍历。多年来,Sitepoint 上一直有一篇出色的文章,解释了如何使用大量示例代码完成此操作。

    【讨论】:

    • 非常感谢您的回答,但我用递归编写了我的解决方案:)
    【解决方案2】:

    我的解决方案

    function updatemoney($id)
    {
        $child = mysql_query("SELECT * FROM `company` WHERE `parent_id` = ?", $id);
        if(empty($child))
        {
            mysql_query("UPDATE `company` SET `allcash`=`cash` WHERE `id`=?", $id);
        }
        else
        {
            for($i = 0; $i< count($child); $i++)
            {
                updatemoney($child[$i]["id"]);
            }
            $childmoney = mysql_query("SELECT sum(`allcash`) AS `total` FROM `company` WHERE `parent_id` = ?", $id);
            $parentmoney = mysql_query("SELECT `cash` FROM `company` WHERE `id` = ?", $id);
            $sum = $childmoney[0]["total"] + $parentmoney[0]["cash"];
            mysql_query("UPDATE `company` SET `allcash`=? WHERE `id`=?", $sum, $id);
    
        }
    

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多