0

这是我的resultsMySQL 表的示例:

在此处输入图像描述

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

/* 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:您无法在 FROM 子句中指定目标表 'r' 进行更新

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

SQL小提琴

4

1 回答 1

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()在更新表的更新语句中执行摘要查询(在您的情况下)的限制。

于 2016-09-13T18:50:32.273 回答