MySQL - 更新所有记录以匹配组中的最大值

时间:2009-07-02 15:42:12

标签: 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
7,   asdf , 1234-3,   0

基本上,我想要做的是将'flag'fild中的所有数字设置为与特定代码相关的最大值。

因此,在代码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中完成这项工作。有一大堆数据。

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:0)

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