我有一个表,用于存储甘特图的任务。每个任务都有开始日期、持续时间和完成百分比。
这是我的单个项目表格的摘录
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 的记录进行更新
这可以使用 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 ;
我希望这是您所需要的。