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

MySQL: shift all dates forward so max date = now

这是我的示例 results MySQL table:

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

/* 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

但是这个错误是:

Error Code 1093: You can't specify target table 'r' for update in FROM clause

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

SQL Fiddle

你可以用两个连续的语句来完成。

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

编辑哦,你必须为每个人做,嗯?让我们使用一个临时的 table。 (这些家伙在你处理完它们后就会消失。)

 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;

temp table 包含每个用户一行。它克服了您不能在更新 table.

的更新语句中执行摘要查询(MAX() 在您的情况下)的限制