Как удалить повторяющиеся строки на основе значения столбца в MySQL? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть таблица

id    user_id    date        created_at
1     123     2020-02-02  2020-02-02 10:00:00
2     123     2020-02-02  2020-02-02 10:00:01
3     789     2020-02-12  2020-02-12 12:00:00
4     456     2020-02-10  2020-02-10 10:00:00
5     456     2020-02-10  2020-02-10 10:00:01

Я хочу удалить повторяющиеся записи и хочу получить желаемый вывод -

id    user_id    date        created_at
1     123     2020-02-02  2020-02-02 10:00:00
3     789     2020-02-12  2020-02-12 12:00:00
4     456     2020-02-10  2020-02-10 10:00:00

Я пробовал следующий запрос -

DELETE
    `a`
FROM
    `table1` AS `a`,
    `table1` AS `b`
WHERE
    `a`.`id` < `b`.`id` AND `a`.`user_id` <=> `b`.`user_id`

Но это занимает слишком много времени, и я получаю ошибку:

Lock wait timeout exceeded; try restarting transaction

В моей таблице содержится более 9500000 записей.

Что может быть лучшим альтернативным запросом?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

У вас много записей, следовательно, выдает ошибку тайм-аута. Выполните эту операцию в меньшем количестве. Попробуйте ниже запрос

DELETE
        `a`
    FROM
        `table1` AS `a` inner join
        `table1` AS `b`
    WHERE
        `a`.`id` < `b`.`id` AND `a`.`user_id` == `b`.`user_id` and `a`.`id` >***10000(Increase this)***

Надеюсь, это поможет вам.

0 голосов
/ 27 февраля 2020

Попробуйте использовать коррелированный подзапрос:

DELETE t1
FROM table1 t1
WHERE EXISTS ( SELECT NULL
               FROM table1 t2
               WHERE t1.user_id = t2.user_id
                 AND t1.id > t2.id )

Индекс (user_id, id) увеличит скорость запроса.

...