0

私はこれを実行しようとしています:

$stmt=$cxn->prepare("UPDATE table1 SET used='1' WHERE prim_id != 
     (SELECT MAX(prim_id) FROM table1 WHERE email='email12345@gmail.com')");
$stmt->execute(array());

ただし、MySQL エラーが発生します: #1093 - You can't specify target table 'table1' for update in FROM clause.

このエラーを検索したところ、In MySQL, you can't modify the same table which you use in the SELECT part..

そのクエリを変更して機能させるにはどうすればよいですか?

事前にどうもありがとう

4

2 に答える 2

1

クエリにロジックが欠けているだけです。次のように変更します。

UPDATE table1
SET used='1'
WHERE `email` = 'email12345@gmail.com'
  AND prim_id != (
    SELECT MAX(prim_id) 
    FROM table1
    WHERE email='email12345@gmail.com')
于 2012-07-14T02:02:12.580 に答える
1

これを試して:

UPDATE table1 t1, (SELECT MAX(prim_id) AS max_prim_id
                     FROM table1 WHERE email='email12345@gmail.com') tmp
SET t1.used='1'
WHERE t1.prim_id != tmp.max_prim_id
AND t1.`email` = 'email12345@gmail.com'

サブクエリを削除し、通常の一時テーブルを使用してテーブル「tmp」の結果を格納します。クエリは、更新のために 2 つのテーブルを取得します。

  • table1 (エイリアス t1 を使用)
  • 一時テーブル (別名 tmp 付き)

WHERE 句:

  • 2 つのテーブルがどのように結合されているかを示します
  • テーブル t1 で考慮するレコードを制限します

SET 句は、t1.used のみが更新されることを示しています。

UPDATE ステートメント

于 2012-07-14T02:28:14.183 に答える