仅在MySQL Query中设置某个值时更新某个列

时间:2014-10-18 11:35:08

标签: php mysql case

我有一个项目管理应用程序我用PHP和MySQL构建,下面的函数用于批量更新与项目相关的所有任务,在某些情况下,这可能是200-300个MySQL记录一次更新。

我刚刚意识到我的设计存在缺陷。此函数更新我的数据库列statusdate_modifieddate_completed

这在大多数时候都很棒,但我刚刚意识到用户经常会忘记"开始"设置date_started列的任务。

如果从未设置date_started列,则其值0000-00-00 00:00:00date_started列设置为0000-00-00 00:00:00date_completed列现在设置为......这会破坏我的甘特图功能。

所以我需要在下面修改我的SQL,以便在设置statuscompleted时,它会以某种方式检查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)

1 个答案:

答案 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'";