Uppdatering:Det här svaret täcker den allmänna felklassificeringen. För ett mer specifikt svar om hur man bäst hanterar OP:s exakta fråga, se andra svar på denna fråga
I MySQL kan du inte ändra samma tabell som du använder i SELECT-delen.
Det här beteendet finns dokumenterat på:http://dev.mysql.com/doc/refman/5.6/en/update.html
Du kanske bara kan gå med i bordet för sig själv
Om logiken är enkel nog att omforma frågan, förlora underfrågan och sammanfoga tabellen med sig själv, med hjälp av lämpliga urvalskriterier. Detta kommer att få MySQL att se tabellen som två olika saker, vilket gör att destruktiva förändringar kan genomföras.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Alternativt kan du prova att kapsla underfrågan djupare i en from-sats ...
Om du absolut behöver underfrågan finns det en lösning, men det är lämpligt av flera skäl, inklusive prestanda:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Den kapslade underfrågan i FROM-satsen skapar en implicit temporarytable , så det räknas inte som samma tabell som du uppdaterar.
... men se upp för frågeoptimeraren
Tänk dock på att från MySQL 5.7 .6
och framåt kan optimeraren optimera underfrågan och fortfarande ge dig felet. Lyckligtvis är optimizer_switch
variabel kan användas för att stänga av detta beteende; även om jag inte kunde rekommendera att göra detta som något mer än en kortsiktig lösning eller för små enstaka uppgifter.
SET optimizer_switch = 'derived_merge=off';
Tack till Peter V. Mørch för detta råd i kommentarerna.
Exempel på teknik kom från Baron Schwartz, ursprungligen publicerad på Nabble , parafraserad och utökad här.