MySQL:将所有日期向前移动,以便最大日期=现在

时间:2016-09-13 18:28:38

标签: mysql mysql-error-1093

以下是我的results MySQL表的示例:

enter image description here

我希望按相同的时间间隔向特定用户转发所有日期,以便该用户的最高日期是当前时间戳。我知道如何以天为单位获得间隔:

/* result is 823 */
SELECT DATEDIFF(
   CURDATE(),
   (SELECT MAX(r.`LastReviewed`) 
    FROM `results` r
     WHERE r.`UserID` = 1)
)

但是我不知道如何在更大的查询中使用这些信息来改变日期。我试过了:

UPDATE `results` r
SET r.`LastReviewed` = 
        r.`LastReviewed` + 
        INTERVAL (
            SELECT DATEDIFF(
               CURDATE(),
               (SELECT MAX(r.`LastReviewed`) 
                FROM `results` r
                 WHERE r.`UserID` = 1)
            )
        ) DAY
WHERE r.`UserID` = 1

但是这个错误与:

  

错误代码1093:您无法指定目标表' r'用于FROM子句中的更新

第二个问题是,即使它有效,如果它发生在接近当天结束时(晚上11:59),它也有可能将最大记录转移到未来。我希望新的最大值是当前的日期时间

SQL Fiddle

1 个答案:

答案 0 :(得分:2)

你可以连续两次发表声明。

SELECT @offset := DATEDIFF(
   CURDATE(),
   (SELECT MAX(LastReviewed) 
    FROM results
     WHERE UserID = 1)
);
UPDATE results
   SET LastReviewed = LastReviewed + INTERVAL @offset DAY
 WHERE UserID = 1;

编辑哦,你必须为每个人都这样做,是吗?我们来使用临时表。 (当你完成它们时,这些家伙会消失。)

 CREATE TEMPORARY TABLE offsets
 SELECT DATEDIFF(CURDATE(),MAX(LastReviewed)) offset,
        UserId  
   FROM results
  GROUP BY UserId;

 UPDATE results
   JOIN offsets ON results.UserId = offsets.UserId
    SET results.LastReviewed = results.LastReviewed + INTERVAL offsets.offset DAY;

临时表为每个用户包含一行。它克服了在更新表的更新语句中无法执行摘要查询(在您的情况下为MAX())的限制。