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 main
和 tat air
,其值分别为 13.3
和 10.1
。 12.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 - 计算列层次结构中的一些值的主要内容,如果未能解决你的问题,请参考以下文章