【问题标题】:MySQL - updating all records to match max value in groupMySQL - 更新所有记录以匹配组中的最大值
【发布时间】:2009-07-02 15:42:12
【问题描述】:

我有一个这样的事务表

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 的情况下,它应该使用带有标志 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
7 ,  asdf , 1234-3,   8

如果可能的话,我想纯粹在 MySQL 中执行此操作。有一个非常大的数据集。

【问题讨论】:

    标签: mysql


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

    【讨论】:

    • 嗯,这似乎没有按预期更改标志。
    • 多年来我第一次做这样的事情,这个答案帮助我做了一个更复杂的查询
    【解决方案2】:

    使用 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      相关资源
      最近更新 更多