我有一个项目管理应用程序,我正在用PHP和MySQL构建,下面的函数用于批量更新与项目相关的所有任务,在某些情况下,这可能是200-300条MySQL记录同时更新。
不过我刚刚意识到我的设计有一个缺陷。此函数更新我的数据库列status
、date_modified
和date_completed
这在大多数情况下都很好,但我刚刚意识到,用户经常会忘记"启动"一个设置date_started
列的Task。
如果从未设置date_started
列,则其值为0000-00-00 00:00:00
,date_started
列设置为0000-00-00 00:00:00
,date_completed
列设置为NOW。。。这破坏了我对这些任务的甘特图功能。
因此,我需要修改下面的SQL,以便在将status
设置为completed
时,它将以某种方式检查date_stared
列是否===0000-00-00 00:00:00
,如果是,它还需要将该列更新为NOW。
我相信在MySQL中使用CASE
是可能的,而不必将每个记录查询到PHP中进行检查,然后在需要时进行单独的UPDATE,但我在这些更高级的SQL功能方面的经验很少。
有人能帮我解决问题吗?
public function completeAllTasks($projectId, $completed_date = true){
// Update Project Task STATUS and Date_MODIFIED
$sql = "UPDATE `project_tasks`
SET `status` = 'Completed',
`modified_user_id` = '$this->user_id',
`date_completed` = UTC_TIMESTAMP()
`date_modified` = UTC_TIMESTAMP()
WHERE `project_id` = '$projectId'
AND `status` != 'Completed'
AND `heading` != '1'";
return $this->db->query($sql);
}
更新
我做了一些测试,这似乎奏效了。。。
`date_started` = (CASE
WHEN date_started = '0000-00-00 00:00:00'
THEN UTC_TIMESTAMP()
ELSE date_started
END)
$sql = "UPDATE `project_tasks`
SET `status` = 'Completed',
`modified_user_id` = '$this->user_id',
`date_completed` = UTC_TIMESTAMP(),
`date_modified` = UTC_TIMESTAMP(),
`date_started` = CASE
WHEN date_started = '0000-00-00 00:00:00' THEN NOW()
ELSE date_started
END
WHERE `project_id` = '$projectId'
AND `status` != 'Completed'
AND `heading` != '1'";