2009-07-02 2 views
2

У меня есть таблица транзакций, как такMySQL - обновление всех записей, чтобы соответствовать максимальному значению в группе

id , name , code , flag 
1 , john , 1234-3, 2 
2 , joe , 1111-2, 1 
3 , paul , 1234-3, 3 
4 , asdf , 1234-3, 3 
5 , asdf , 1111-2, 5 
6 , asdf , 1234-3, 8 
7, asdf , 1234-3, 0 

В принципе, то, что я хочу сделать, это установить все номера в «флаге» Фейлд до максимального значения соответствующего к определенному коду.

Так в случае кода 1234-3 он должен обновить все флаги с этим кодом с флагом NUM 8 в случае 1111-2, он должен обновить все флаги с этим кодом с 5.

Я хочу, чтобы превратить его в эту таблицу

id , name , code , flag 
1 , john , 1234-3, 8 
2 , joe , 1111-2, 5 
3 , paul , 1234-3, 8 
4 , asdf , 1234-3, 8 
5 , asdf , 1111-2, 5 
6 , asdf , 1234-3, 8 
7 , asdf , 1234-3, 8 

Я хотел бы сделать это в MySQL чисто, если это возможно. Существует очень большой набор данных.

ответ

8
UPDATE t_transaction tu 
JOIN (
     SELECT code, MAX(flag) AS flag 
     FROM t_transaction 
     GROUP BY 
       code 
     ) t 
ON  tu.code = t.code 
SET  tu.flag = t.flag 
+0

Хм, этот, кажется, не меняет флаги, как ожидалось. –

+0

мои приговоры .. это сработало отлично! еще раз спасибо! –

+0

Впервые в возрасте я снова сделал что-то подобное, этот ответ помог мне сделать несколько более сложный запрос – Webber

0

Это может быть выполнено очень просто в двух запросах с использованием переменных mysql. Я хотел бы указать, что Quassnoi имеет отличный ответ, который может работать лучше для вашего приложения. Но это полезно иметь в виду:

Если вы используете транзакционный механизм хранения (InnoDB):

START TRANSACTION; 
SELECT @myvar := MAX(flag) FROM t WHERE code = '...' 
UPDATE t SET flag = @myvar WHERE code = '...'; 
COMMIT; 

Если вы используете не транзакционный механизм хранения (MyISAM):

LOCK TABLES t WRITE; 
SELECT @myvar := MAX(flag) FROM t WHERE code = '...' 
UPDATE t SET flag = @myvar WHERE code = '...'; 
UNLOCK TABLES; 
Смежные вопросы