2012-08-27 4 views
0

Я делаю работу для клиента, но поскольку я не использовал PHP/MySQL какое-то время, я забыл про простые вещи, надеюсь, что вы можете мне помочь.Простой UPDATE SQL Query

У меня есть следующий SQL таблицу:

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

Мой запрос должен поставить весь столбец «кредит» 0 для строки, имеющей более высокий идентификатор, за исключением.

Так что я хотел бы сделать:

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

Заранее спасибо за любую помощь :)

ответ

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

будет обновлять какую-либо строку, которые имеют и ID больше, чем переменная $ID

Если вы только хотите обновить строку с максимальным идентификатором, а затем использовать:

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

Edit: Как 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) 

Примечание. Поскольку подзапрос в трюке подзапроса разблокирует исходную таблицу, рекомендуется запустить его в рамках транзакции - если таблица разблокирована из запроса, она может измениться к моменту ее обновления - так что это будет хорошая идея использовать этот тип запроса в транзакции.

+0

Он выглядел работающим, но я получаю: вы не можете указать таблицу целей «test» для обновления в предложении FROM! – wiredmark

+0

@MarcelloSilvestri Вы не должны иметь предложение 'from' в инструкции обновления. Каков весь ваш SQL? – Fluffeh

+0

UPDATE $ table SET credit = 0 WHERE credit = '$ credit' AND statid = '$ statid' AND userid = '$ userid' И ID = (SELECT MAX (ID) из таблицы $) (кредит, statid и userid должен быть равен тому, который был вставлен в предыдущую форму) – wiredmark