揮発性のメモ2

知識をメモ書きしておく

UPDATEでエラー

You can't specify target table 't1' for update in FROM clause

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.10.9 サブクエリーのエラー

サブクエリの FROM 節と更新対象の両方に同じテーブル(この場合、テーブル t1)を使用することはできません。

ヴァー

直近5分のレコードのうち最新レコードをひとつだけ更新する

最初に書いたクエリ:対象テーブルで最新分をサブクエリで求める方法

UPDATE log SET flag=1 WHERE no=(SELECT no FROM log WHERE 
  time>DATE_SUB(NOW(),INTERVAL 5 MINUTE) AND flag=0 ORDER BY time DESC LIMIT 1);

次に書いたクエリ:サブクエリで書いた方を仮テーブルにする

CREATE TEMPORARY TABLE SELECT no FROM log WHERE 
  time>DATE_SUB(NOW(),INTERVAL 5 MINUTE) AND flag=0 ORDER BY time DESC LIMIT 1;
UPDATE log SET flag=1 WHERE no=(SELECT no FROM tmplog);

最終的なクエリ:UPDATEでもLIMITやORDERを使っていいので普通に

UPDATE log SET flag=1 WHERE 
  time>DATE_SUB(NOW(),INTERVAL 5 MINUTE) AND flag=0 ORDER BY time DESC LIMIT 1;