微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 从节点树中获取总和

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

非常感谢你

解决方法:

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上发表了一篇很好的文章,解释了如何通过大量示例代码完成这项工作.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐