2009-07-02 18 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;