2009-07-02 46 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

相關問題