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