【问题标题】:MySQL - update all records to match lastMySQL - 更新所有记录以匹配最后一个
【发布时间】:2009-07-02 10:40:27
【问题描述】:

我有一个这样的事务表

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 中执行此操作。有非常庞大的数据集。

【问题讨论】:

    标签: mysql


    【解决方案1】:
    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
    

    如果您的表是 InnoDB,请确保您在 (code) 上有索引 id 不是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
    

    【讨论】:

    • 有趣,只是为了了解你在做什么;您是否将表连接到自身?
    • 在进行这样的更新时使用索引来加速查询会是个好主意吗? 200 万行
    • 哇,我花了很长时间才得到它!最内层选择获取最后/最大 id,第二个获取标志,第三个通过加入代码设置标志。类似的东西
    • 欢呼@Quassnoi ...在100k行上完美运行.. 200万行表可能需要很长时间,但做得非常好!对此有任何想法:short.ie/i9estp
    • @Quassnoi 如果在上面的那个上,我想将它设置为最大代码而不是最后一个实例中的代码。我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多