从节点树获取总和

时间:2016-05-17 23:36:32

标签: php mysql recursion

我正在学习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;
    }

非常感谢

2 个答案:

答案 0 :(得分:1)

LTREE

你几乎走在正确的轨道上。您几乎偶然发现了将Lierachial数据存储在数据库中的“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的allmoney?

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

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

MPTT

获取分层数据的另一种流行方法是使用Modified Pre Order Tree Traversal。多年来有一篇关于Sitepoint的优秀文章解释了如何通过大量的示例代码完成这项工作。

答案 1 :(得分:1)

我的解决方案

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

    }