2009-07-02 154 views
0

我有一个交易表像这样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 

基本上,我想做的是获得的代码的最后一个实例检查标志,并更新了所有以前的标志与最后的旗号相同的码。

所以在代码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 

我想这样做在MySQL纯粹如果可能的话。有一个非常大的数据集。

回答

4
UPDATE t_transaction tu 
JOIN (
     SELECT tm.code, tm.flag 
     FROM (
       SELECT code, MAX(id) AS id 
       FROM t_transaction 
       GROUP BY 
         code 
       ) td 
     JOIN t_transaction tm 
     ON  tm.id = td.id 
     ) t 
ON  tu.code = t.code 
SET  tu.flag = t.flag 

确保您在(code)有一个指标,如果你的表是InnoDBidPRIMARY KEY,或(code, id),如果你的表是MyISAMid不是PRIMARY KEY

该索引将同时用于JOIN和高效GROUP BY

要设置值的MAX(flag)(不是最后flag):

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 11:31:10

相关问题