以下是我的results
MySQL表的示例:
我希望按相同的时间间隔向特定用户转发所有日期,以便该用户的最高日期是当前时间戳。我知道如何以天为单位获得间隔:
/* 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),它也有可能将最大记录转移到未来。我希望新的最大值是当前的日期时间
答案 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()
)的限制。