我有一個項目管理應用程序,我正在使用PHP和MySQL構建,下面的函數用於批量更新與某個項目相關的所有任務,在某些情況下這可能是200-300個MySQL記錄一次更新。只更新MySQL Query中的某個列(如果它具有一定的值集)
雖然我剛剛意識到我的設計存在缺陷。此功能更新我的數據庫列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
列設置爲現在值......這打破了我的甘特圖功能,這些任務。
所以我需要修改下面,這樣設置status
到completed
時,它會以某種方式檢查,看看我的SQL如果date_stared
列=== 0000-00-00 00:00:00
如果確實如此,則還需要更新該列到現在。
我相信這是可能的在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);
}
UPDATE
我做了一些測試,這似乎這樣的伎倆......
`date_started` = (CASE
WHEN date_started = '0000-00-00 00:00:00'
THEN UTC_TIMESTAMP()
ELSE date_started
END)
我最終通過實驗得到它,但它看起來像你的答案是正確的...我有一個額外的'結束'幷包裹在'()'你可以在我的帖子的底部看到我添加它上面...我不知道這是否是必需的,但我我會選你的答案,因爲它基本上是相同的謝謝 – JasonDavis 2014-10-18 11:53:14
結束是必需的我實際上已經忘記它,但編輯它。儘管你並不需要親子關係 – Brian 2014-10-18 11:55:40