MySQL - 更新所有记录以匹配最后一个

时间:2009-07-02 10:40:28

标签: 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

基本上,我想要做的是获取代码的最后一个实例检查标志,并用最后一个标志num的相同代码更新所有以前的标志。

因此,在代码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

如果可能的话,我想在MySQL中完成这项工作。有一大堆数据。

1 个答案:

答案 0 :(得分: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) InnoDBid,或{{}},请确保您在PRIMARY KEY上有索引1}}如果您的表格为(code, id) MyISAM不是id

此索引既可用于PRIMARY KEY,也可用于JOIN

要将值设置为GROUP BY(不是最后MAX(flag)):

flag