У меня есть таблица транзакций, например,
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
В принципе, я хочу, чтобы последний экземпляр кода проверил флаг и обновил все предыдущие флаги с тем же кодом с последним номером флага.
Итак, в случае кода 1234-3 он должен обновить все флаги с помощью этого кода с флагом № 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, если это возможно. Существует очень большой набор данных.
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
или на (code, id)
, если ваша таблица MyISAM
или 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