Вот пример моего results
MySQL таблицы: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
2 проблемы что даже если он сработает, он рискует перенести максимальную запись в будущее, если это произойдет ближе к концу дня (23:59). Я хотел бы новый максимум, чтобы быть текущим DATETIME
вы не можете сделать это один запрос. вам нужен подзапрос, чтобы получить максимальное значение, но это означает, что вы читаете из таблицы, которую вы пытаетесь обновить. сделайте это пополам: выберите max, а затем используйте это для отдельного обновления. –
@MarcB Привет, Марк. У меня проблемы с логикой этого. Подзапрос не зависит от суперзапроса, так почему это имеет значение? Не первый и второй подзапрос? – BeetleJuice
да, есть. у вас есть «результаты обновления ... (выберите ... из результатов)». поэтому вы выбираете из таблицы, на которую настроен таргетинг для обновления. mysql просто не позволяет этого. единственным допустимым обходным путем является использование 'join' вместо подзапроса. но поскольку вам нужно выполнять совокупные функции, это не будет работать слишком хорошо. –