当前位置: 首页 > 面试题库 >

从节点树获取总和

彭高畅
2023-03-14
问题内容

我正在学习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?我现在需要使用递归,但是我尝试了并且没有任何反应。选择,更新和其他命令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”系统。您只需要进行一些修改。就这样。

您的表可能如下所示:

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上有一篇出色的文章,它解释了如何使用大量示例代码来完成此工作。



 类似资料:
  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • 问题内容: 我有一段这样的HTML: 我有一个与此HTML匹配的WebElement。如何从中仅提取“标题”?方法.getText()返回“ Title \ nAuthor”。 问题答案: 您无法在WebDriver API中执行此操作,而必须在代码中执行。例如: 请注意,结尾的换行符实际上是元素文本的一部分,因此,如果您不想要它,则需要将其删除。

  • 问题内容: 如何使用Jackson从JSON树中接收节点名称?JSON文件看起来像这样: 我有 并且需要类似的东西 谢谢。 问题答案: 此答案适用于2+之前的Jackson版本(最初写为1.8)。请参阅@SupunSameera的答案,以获取与较新版本的Jackson兼容的版本。 “节点名称”的JSON术语是“键”。由于 不包含键,因此您需要进行不同的迭代: 如果 只 需要查看键,则可以使用以下方

  • CPLEX打印出漂亮的节点日志,如何使用docplex获取它们?我尝试过改变内容。解算器。详细和日志输出,但我没有得到要打印的信息(当前解决方案、间隙)。 我正在使用以下代码: 当verbose=5时,将打印所有分支决策(大量垃圾),而verbose=4时,不会打印间隙

  • 上面的数组 id=311的父节点是 id=31,id=2的父节点为null; 请问应该怎么解决?