2014-10-18 27 views
0

我有一個項目管理應用程序,我正在使用PHP和MySQL構建,下面的函數用於批量更新與某個項目相關的所有任務,在某些情況下這可能是200-300個MySQL記錄一次更新。只更新MySQL Query中的某個列(如果它具有一定的值集)

雖然我剛剛意識到我的設計存在缺陷。此功能更新我的數據庫列statusdate_modifieddate_completed

這是偉大的大部分時間,但我只是意識到,往往用戶會忘記「開始」任務,其設置date_started列。

如果date_started列從未設置,則其0000-00-00 00:00:00並用date_started列設置爲0000-00-00 00:00:00date_completed列設置爲現在值......這打破了我的甘特圖功能,這些任務。

所以我需要修改下面,這樣設置statuscompleted時,它會以某種方式檢查,看看我的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) 

回答

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'"; 
+0

我最終通過實驗得到它,但它看起來像你的答案是正確的...我有一個額外的'結束'幷包裹在'()'你可以在我的帖子的底部看到我添加它上面...我不知道這是否是必需的,但我我會選你的答案,因爲它基本上是相同的謝謝 – JasonDavis 2014-10-18 11:53:14

+0

結束是必需的我實際上已經忘記它,但編輯它。儘管你並不需要親子關係 – Brian 2014-10-18 11:55:40

相關問題