PHP - 计算列层次结构中的一些值

Posted

技术标签:

【中文标题】PHP - 计算列层次结构中的一些值【英文标题】:PHP - Counting some values in column hieararchy 【发布时间】:2018-05-14 09:53:02 【问题描述】:

我需要帮助来计算层次结构数组中的值。我有一张这样的桌子:

+--------+------------+-------+-----------+
| kia_id |  kia_name  | value | parent_id |
+--------+------------+-------+-----------+
|      1 | ac service |       |         0 |
|      2 | hil        |       |         0 |
|      3 | dispatch   |       |         1 |
|      4 | tat main   | 13.3  |         3 |
|      5 | tat air    | 10.1  |         3 |
|      6 | sla comp   | 11.7  |         2 |
|      7 | sla serv   |       |         2 |
|      8 | slb        | 9.9   |         7 |
+--------+------------+-------+-----------+

我想像这样在 html 中显示该表格:

+--------+----------------+-------+-----------+------------------------+
| kia_id |    kia_name    | value | parent_id | total_value_from_child |
+--------+----------------+-------+-----------+------------------------+
|      1 | ac service     |       |         0 | 23.4                   |
|      3 |    dispatch    |       |         1 | 23.4                   |
|      4 |       tat main | 13.3  |         3 |                        |
|      5 |       tat air  | 10.1  |         3 |                        |
|      2 | hil            |       |         0 | 21.6                   |
|      6 |    sla comp    | 11.7  |         2 |                        |
|      7 |    sla serv    |       |         2 | 9.9                    |
|      8 |       slb      | 9.9   |         7 |                        |
+--------+----------------+-------+-----------+------------------------+

如何计算所有子值来设置这个父级的总数,请帮助我..

【问题讨论】:

我已经删除了不兼容的标签。重新标记您实际使用的DBMS @YogeshSharma 好的,谢谢 .. ac_service 的总值是否正确,您的预期结果中dispatch 的值发生了什么变化? ac_service 的子代是 dispatch,其值为 12.2(在您的原始数据中)。这还有 2 个子 tat maintat air,其值分别为 13.310.112.2 + 13.3 + 10.1 = 35.6 不是 23.4。请解释你的逻辑。同时发布您已经尝试过的内容并以可消耗的格式提供您的数据:Forum Etiquette: How to post a T-SQL Question。 @Larnu 对不起,我已经修好了 谢谢,现在您只需要发布那些消耗性数据以及您已经尝试过的内容。 :) 【参考方案1】:

我认为您需要将递归 CTE 与聚合结合起来。这个想法是从“底部”(叶子)开始,然后逐步向上。然后聚合引入原始数据。

with cte as (
      select kia_id, value, kia_id as parent_id, 0 as lev
      from t
      where not exists (select 1 from t t2 where t2.parent_id = t.kia_id)
      union all
      select cte.kia_id, cte.kia_value, t.parent_id, cte.lev + 1
      from cte join 
           t
           on cte.parent_id = t.kia_id
    )
select t.*, c.parent_value
from (select cte.parent_id, sum(kia_value) as parent_value
      from cte
      group by cte.parent_id
     ) c join
     t
     on t.kia_id = c.parent_id;

【讨论】:

以上是关于PHP - 计算列层次结构中的一些值的主要内容,如果未能解决你的问题,请参考以下文章

PHP计算一列中包含相同值的MYSQL行

PHP计算在许多列中包含相同值的MYSQL行

根据呼叫日志状态层次结构计算类别中的唯一客户

MDX IIF 语句根据度量和层次结构叶计算新成员

计算机网络层次结构之OSI模型和TCP/IP模型

使用 data.frame 中的上方行和另一列计算值