Обновление: этот ответ охватывает общую классификацию ошибок. Более подробный ответ о том, как лучше всего обрабатывать точный запрос ОП, см. В других ответах на этот вопрос
В MySQL вы не можете изменить ту же таблицу, которую используете в части SELECT.
Это поведение описано в:
http://dev.mysql.com/doc/refman/5.6/en/update.html
Может быть, вы можете просто присоединить стол к себе
Если логика достаточно проста для изменения запроса, потеряйте подзапрос и присоедините таблицу к себе, используя соответствующие критерии выбора. Это приведет к тому, что MySQL увидит таблицу как две разные вещи, позволяющие вносить деструктивные изменения.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Или попробуйте вложить подзапрос глубже в предложение from ...
Если вам абсолютно нужен подзапрос, есть обходной путь, но это
некрасиво по нескольким причинам, включая производительность:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Вложенный подзапрос в предложении FROM создает неявный временный
таблица , поэтому она не считается той же таблицей, которую вы обновляете.
... но следите за оптимизатором запросов
Однако, имейте в виду, что начиная с MySQL 5.7.6 и далее, оптимизатор может оптимизировать подзапрос и все равно выдавать ошибку. К счастью, переменная optimizer_switch
может быть использована для отключения этого поведения; хотя я не мог рекомендовать делать это как что-то большее, чем краткосрочное исправление или для небольших одноразовых задач.
SET optimizer_switch = 'derived_merge=off';
Спасибо Peter V. Mørch за этот совет в комментариях.
Пример техники был от Барона Шварца, , первоначально опубликованного в Набле , перефразирован и расширен здесь.