我有一个像这样的交易表
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中完成这项工作。有一大堆数据。
答案 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)
且 InnoDB
为id
,或{{}},请确保您在PRIMARY KEY
上有索引1}}如果您的表格为(code, id)
或 MyISAM
不是id
。
此索引既可用于PRIMARY KEY
,也可用于JOIN
。
要将值设置为GROUP BY
(不是最后MAX(flag)
):
flag