2009-07-02 48 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的情況下,它應該在1111-2的情況下,旗NUM 8 代碼更新所有標記,它需要與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

嗯,這似乎並沒有像預期的那樣改變旗幟。 – 2009-07-02 16:00:45

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;