我有一个像这样的交易表
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中完成这项工作。有一大堆数据。
答案 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;