12

IDが最も高く、idSessionというフィールドが65に等しいテーブルの行を更新するMySQLクエリを作成しようとしています。次のようになります。

UPDATE `History` 
SET `state` = 0 
WHERE `id` = (SELECT MAX(id) FROM `History` WHERE `idSession` = 65);

そして、私はエラーメッセージを受け取ります:

「エラーコード:1093。FROM句で更新するターゲットテーブル「履歴」を指定できません」。

誰かが私の構文の何が問題になっているのか知っていますか?

4

3 に答える 3

29

正確に言うと、まったく同じテーブルの条件に基づいて同じテーブルを更新する場合、テーブルから選択することはできません。(それは意図的に紛らわしく書かれています:p)

これを試して:

UPDATE `History` SET `state`=0 WHERE `idSession`=65 ORDER BY `id` DESC LIMIT 1

ORDERとクエリLIMITを使用できます; UPDATEDELETE

于 2012-07-11T13:42:05.607 に答える
6

これはどうですか:

UPDATE `History`
SET `state` = 0
WHERE `idSession` = 65
ORDER BY `id` DESC 
LIMIT 1
于 2012-07-11T13:41:55.500 に答える
2

これはMySQLの模倣です。これを回避する方法は2つあります(実際には3つですが、3つ目は好きではありません)。

1)クエリのため:

SELECT MAX(id) 
FROM History 
WHERE idSession = 65

次と同じ結果が生成されます。

SELECT id 
FROM History 
WHERE idSession = 65
ORDER BY id DESC
  LIMIT 1

@xdazzおよび@Kolinkによって提供されるソリューションを使用してORDER BYUPDATEステートメント内の(独自のMySQL)構文を使用するように更新を変更できます。

2)これを回避する2番目の方法は、テーブルを上記のサブクエリに結合することです。これは、より複雑な条件/サブクエリ/結合で機能し、単純なOrderByでは書き換えることができません。

UPDATE 
      History AS h
  JOIN
      ( SELECT MAX(id) AS max_id 
        FROM History 
        WHERE idSession = 65
      ) AS m
    ON m.max_id = h.id
SET h.state = 0 ;
于 2012-07-11T14:03:47.773 に答える