更新:この回答は、一般的なエラー分類を対象としています。 OPの正確なクエリを最適に処理する方法に関するより具体的な回答については、この質問に対する他の回答を参照してください。
MySQLでは、SELECT部分で使用するのと同じテーブルを変更することはできません。
この動作は次の場所に文書化されています: http://dev.mysql.com/doc/refman/5.6/en/update.html
テーブルをそれ自体に結合できるかもしれません
ロジックがクエリの形を変えるほど単純な場合は、サブクエリを失い、適切な選択基準を使用してテーブルをそれ自体に結合します。これにより、MySQLはテーブルを2つの異なるものとして認識し、破壊的な変更を進めることができます。
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句にネストされたサブクエリは、暗黙の一時テーブルを作成します 、したがって、更新しているのと同じテーブルとしてカウントされません。
...ただしクエリオプティマイザーに注意してください
ただし、MySQL5.7からは注意してください。 .6
以降、オプティマイザーはサブクエリを最適化しても、エラーが発生する可能性があります。幸い、optimizer_switch
変数を使用して、この動作をオフにすることができます。ただし、これを短期的な修正以上のものとして、または小さな1回限りのタスクのために行うことはお勧めできません。
SET optimizer_switch = 'derived_merge=off';
PeterV.Mørch に感謝します コメントでこのアドバイスを。
テクニックの例は、バロンシュワルツ、元々はNabbleで公開されました 、ここで言い換えて拡張します。