计算树上分层的完整性百分比

问题描述 投票:0回答:1

我有一个表,用于存储甘特图的任务。每个任务都有开始日期、持续时间和完成百分比。

这是我的单个项目表格的摘录

id 文字 开始日期 持续时间 进步 家长 排序 项目
1 DT下一阶段1 2023-02-23 00:00:00 281 0 0 1 1
2 准备 2023-02-23 00:00:00 19 0 1 2 1
3 准备 2023-02-23 00:00:00 19 0 2 3 1
4 探索 2023-03-23 00:00:00 122 0.9 1 4 1
5 Bbp 定义 2023-03-23 00:00:00 113 1 4 5 1
6 Bbp批准 2023-08-01 00:00:00 5 0 4 6 1
7 意识到 2023-07-23 00:00:00 153 0.5 1 7 1
8 系统配置 2023-08-01 00:00:00 122 0.2 7 8 1
9 配置系统 2023-08-01 00:00:00 145 0.4 7 9 1
10 单元测试 2023-07-23 00:00:00 123 0 7 10 1
11 定制开发 2023-07-23 00:00:00 3 0 7 11 1
12 功能规格 2023-07-23 00:00:00 62 0 7 12 1
13 技术规格 2023-07-23 00:00:00 73 0 7 13 1
14 单元测试 2023-07-23 00:00:00 92 0 7 14 1
15 数据迁移 2023-08-23 00:00:00 122 0 7 15 1
16 模拟1 2023-08-23 00:00:00 31 0 15 16 1
17 模拟2 2023-09-23 00:00:00 30 0 15 17 1
18 模拟3 2023-10-23 00:00:00 31 0 15 18 1

该表用于显示甘特图,用户可以更新每个活动的进度。到目前为止,我还没有将父母的进度更新到最高级别,我正在尝试为此建立一个触发器。

假设用户将第 18 行进度设置为 0.6 (60%)。这意味着进度为 31 x 0.6 天 = 18.6 天。第 18 行父行是 15,所以我需要对父行 = 15 的每行进行持续时间 * 进度,得到总计:31 x 0 + 30 x 0+ 31 x 0.6=18.6 然后我需要获取第 15 行的持续时间并执行 18.6/122 = 0.15,即第 15 行的进度。因此我需要使用进度 = 0.15 更新第 15 行。 然后,第 15 行父行是 7,因此我必须对父行为 7 的所有行执行相同操作并更新第 7 行。 第 7 行父项是 1,同样的数学运算。是否可以在 Mysql 触发器中使用一个或多个查询? 该表将包含不同项目的数据,我只需要对与我开始的行匹配相同项目 ID 的记录进行更新

sql mysql triggers
1个回答
0
投票

这可以使用 MySQL 触发器来实现。我找不到表名,所以在查询中我只是将其称为“表”。将其替换为您自己的表名称。

DELIMITER $$

CREATE TRIGGER update_parent_progress 
AFTER UPDATE ON table
FOR EACH ROW 
BEGIN
    DECLARE total_duration DECIMAL(10,2);
    DECLARE total_progress DECIMAL(10,2);
    DECLARE parent_id INT;

    -- Get the parent ID of the updated row
    SELECT parent INTO parent_id FROM table WHERE id = NEW.parent;

    -- Calculate the total duration and progress of child tasks
    SELECT SUM(duration * progress) INTO total_duration
    FROM table
    WHERE parent = parent_id AND project = NEW.project;

    -- Calculate the total progress of child tasks
    SELECT SUM(duration) INTO total_progress
    FROM table
    WHERE parent = parent_id AND project = NEW.project;

    -- Update the progress of the parent task
    UPDATE table
    SET progress = total_duration / total_progress
    WHERE id = parent_id AND project = NEW.project;
END$$

DELIMITER ;

我希望这是您所需要的。

© www.soinside.com 2019 - 2024. All rights reserved.