2

私はMYSQLクエリステートメントを初めて使用しますが、現在、次のようなコードの一部で立ち往生しています。

UPDATE fb_messages
SET sent = 'Yes' 
WHERE msg_id = (SELECT MAX(msg_id) AS MSG_ID 
                FROM fb_messages
                WHERE sent = 'No')

このエラーが発生します

#1093 - You can't specify target table 'fb_messages' for update in FROM clause

同様のケースを回避するための解決策を探しましたが、本当に見つかりませんでした。助けてください

4

4 に答える 4

7

これは機能するはずです。

UPDATE fb_messages fb1, (SELECT MAX(msg_id) AS MSG_ID 
                FROM fb_messages
                WHERE sent = 'No') fb2
SET sent = 'Yes' 
WHERE fb1.msg_id = fb2.MSG_ID

:これにより一時が作成されます。行数が多いとクエリが遅くなる場合は、インデックス/主キーを使用して一時テーブルを作成してみてください。リンク(出典:Alex Comment

このフィドルを参照してください

于 2013-03-10T19:19:30.267 に答える
2

これを試して

   UPDATE fb_messages
   SET sent = 'Yes'
   WHERE sent = 'No'
   ORDER BY msg_id DESC
   limit 1
于 2013-03-10T19:07:12.560 に答える
0

「MySQLでは、SELECT部分​​で使用するのと同じテーブルを変更することはできません。この動作はhttp://dev.mysql.com/doc/refman/5.6/en/update.htmlに記載されています。 」

それを2つのステートメントに分割します。

CREATE TABLE Updates (
  msg_id int
);

INSERT Updates (msg_id)
SELECT
  MAX(msg_id)
FROM fb_messages
WHERE sent = 'No';

UPDATE fb_messages o, Updates u
SET o.sent = 'Yes'
WHERE o.msg_id = u.msg_id

以下の記事でカバーされている回避策があります

参照:MySQLエラー1093-FROM句で更新するターゲットテーブルを指定できません

于 2013-03-10T19:22:18.103 に答える
-1

WHERE条件の間にもう1つselectクエリを追加してください

例:

UPDATE t1 
SET t1.Status = 5
WHERE t1.SearchID NOT IN 
(SELECT TMP.SearchID FROM 
    (SELECT MIN(t1.SearchID) AS SearchID
  FROM t1 
 WHERE t1.ID = '750') TMP)
 AND t1.ID = '750'
于 2013-11-04T08:27:52.270 に答える