Получил такую ошибку при выполнении SQL запроса со вложенным подзапросом следующего вида.
UPDATE table_name
SET col = (SELECT col FROM table WHERE id = :x)
WHERE id = :y
Причина ошибки довольно проста, MySQL не даст обновить ту же самую таблицу, из которой происходит чтение. Проблему можно решить парой способов.
Способ 1. C использованием JOIN, предпочтительный.
UPDATE table_name t1
JOIN table_name t2 ON t2.id = :x
SET t1.val = t2.val
WHERE t1.id = :y
Способ 2. С использованием SELECT FROM SELECT. В этом случае для результата внутреннего подзапроса будет создана временная таблица, и обновление пройдет успешно.
UPDATE table_name
SET col = (SELECT col FROM (SELECT col FROM table WHERE id = :x) AS t2)
WHERE id = :y
Примечание. Если с SELECT FROM SELECT всё понятно, то многие не знают что JOIN также работает при запросах с оператором DELETE. Возьмём к примеру таблицу (id, name), где id — уникальный идентификатор, name — название, и возникла задача удалить записи с дубликатами названий. Решить проблему можно таким вот запросом.
DELETE t1
FROM table_name t1
JOIN table_name t2 ON t2.name = t1.name AND t2.id < t1.id