0

私はクライアントのために仕事をしていますが、しばらく PHP/MySQL を使用していないため、いくつかの簡単なことを忘れていました。助けていただければ幸いです。

次の SQL テーブルがあります。

ID (non-null, autoincrement) | credit (int)

私のクエリでは、より高い ID を持つ行を除いて、「クレジット」列全体を 0 にする必要があります。

だから私はするだろう:

UPDATE $table SET credit = 0 WHERE... ?

助けてくれてありがとう:)

4

1 に答える 1

2
UPDATE $table SET credit = 0 WHERE ID > $ID

変数より大きい ID を持つすべての行を更新します$ID

最大 ID で行を更新するだけの場合は、次を使用します。

UPDATE $table SET credit = 0 WHERE ID = (select max(id) from $table)

編集: Eggyal が正しく指摘しているように、MySQL は更新と同じテーブルでのサブクエリを好みませんが、うまく回避できます。

UPDATE $table 
    SET credit = 0 
    WHERE 
        credit='$credit' 
        AND statid='$statid' 
        AND userid='$userid' 
        AND ID = (select ID from (SELECT MAX(ID)as ID from $table) a)

そして私のコンソールからの例:

mysql> select * from first;
+------+-------+
| id   | title |
+------+-------+
|    1 | aaaa  |
|    2 | bbbb  |
|    3 | cccc  |
|    4 | NULL  |
|    6 | eeee  |
+------+-------+
5 rows in set (0.00 sec)

mysql> update first set title='ffff' where id=(select max(id) from first);
ERROR 1093 (HY000): You can't specify target table 'first' for update in FROM clause

mysql> update first set title='ffff' where id=(select ID from (select max(id) as ID from first) a);
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from first;
+------+-------+
| id   | title |
+------+-------+
|    1 | aaaa  |
|    2 | bbbb  |
|    3 | cccc  |
|    4 | NULL  |
|    6 | ffff  |
+------+-------+
5 rows in set (0.00 sec)

注: サブクエリ トリック内のサブクエリは元のテーブルのロックを解除するため、これをトランザクション内で実行することをお勧めします。テーブルがクエリからロック解除されている場合、更新されるまでに変更されている可能性があります。トランザクション内でこのタイプのクエリを使用することをお勧めします。

于 2012-08-27T10:16:55.753 に答える