MySQL - обновить все записи, чтобы они соответствовали последним

0

У меня есть таблица транзакций, например,

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, если это возможно. Существует очень большой набор данных.

Теги:

1 ответ

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 или на (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
  • 0
    Интересно, просто чтобы понять, что вы делаете; Вы присоединяете стол к себе?
  • 0
    @Derek: трижды.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню