我有一个项目管理应用程序我用PHP和MySQL构建,下面的函数用于批量更新与项目相关的所有任务,在某些情况下,这可能是200-300个MySQL记录一次更新。
我刚刚意识到我的设计存在缺陷。此函数更新我的数据库列status
,date_modified
和date_completed
这在大多数时候都很棒,但我刚刚意识到用户经常会忘记"开始"设置date_started
列的任务。
如果从未设置date_started
列,则其值0000-00-00 00:00:00
且date_started
列设置为0000-00-00 00:00:00
和date_completed
列现在设置为......这会破坏我的甘特图功能。
所以我需要在下面修改我的SQL,以便在设置status
到completed
时,它会以某种方式检查date_stared
列是否= 0000-00-00 00:00:00
和如果是这样,它还需要将该列更新为NOW。
我相信在MySQL中使用CASE
可以实现这一点,而不必将每条记录查询到PHP中进行检查,然后在需要时单独更新,但我在这些更高级的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)
答案 0 :(得分:1)
$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'";