Удалить дубликаты записей из базы данных с условиями

0

У меня был хороший взгляд, но havnt смог найти решение, надеясь, что кто-то может помочь с этим.

У меня есть таблица результатов MySQL из внутреннего приложения регистрации, которое записывает результат из процедуры проверки, существует ряд процедур проверки, которые идентифицируются с столбцом трекера:

id (int)(PK), tracker (int), time (timestamp), result (int)

Результат должен быть записан только в том случае, если предыдущий результат не является тем же, но нужно только внести изменения. К сожалению, это было проигнорировано, когда оно было построено (в спешке) месяц назад, и результаты были записаны вслепую без каких-либо проверок предыдущих результатов. Это теперь было записано, но у меня все еще осталось несколько тысяч строк, из которых значительное число - это повторяющиеся записи, и я после этого очистил их, чтобы просто оставить точки изменения.

Поэтому мне нужно пройти через каждую строку, посмотреть на предыдущий результат, записанный этим трекером, и удалить строку, если она та же, это немного превышает мой опыт работы с MySQL, и попытки, которые я сделал до сих пор, были довольно бедный!

Может ли кто-нибудь помочь?

Теги:

3 ответа

2
Лучший ответ

Использование:

   DELETE a
     FROM YOUR_TABLE a
LEFT JOIN (SELECT MAX(t.id) AS latest_id
             FROM YOUR_TABLE t
         GROUP BY t.tracker, t.result) b ON b.latest_id = a.id
    WHERE b.latest_id IS NULL

Альтернативный вариант с использованием IN:

DELETE FROM YOUR_TABLE
 WHERE id NOT IN (SELECT x.latest_id
                   FROM (SELECT MAX(t.id) AS latest_id
                          FROM YOUR_TABLE t
                      GROUP BY t.tracker, t.result) x )
  • 0
    Первый из них сделал то, что я делал, уменьшил количество строк примерно на 90%, что, безусловно, должно ускорить выполнение запросов и резервных копий. Большое спасибо!
  • 1
    Зачем вам нужен подзапрос оболочки x во втором предложенном запросе?
Показать ещё 1 комментарий
0

Я думаю, вам нужен уникальный индекс в таблице:

ALTER IGNORE TABLE table ADD UNIQUE INDEX (tracker, time, result)

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

При добавлении новых строк в качестве вставок, которые будут дублировать существующий ключ (трекер, время, результат), вам придется использовать INSERT IGNORE....

  • 0
    Это не указано явно, но OP читает так, как будто это предназначено ... но вы не можете применить ограничение, пока данные не удовлетворят его. И ОП заявляет, что они хотят УДАЛИТЬ дубликаты ...
  • 0
    У меня были мысли по этому поводу для будущей записи, но результат, полученный через несколько минут после другого, все равно будет производить новую строку, даже если результат такой же, как время, конечно, другое?
0

Есть жалобы, что это выполняется медленно, но это, вероятно, не влияет на вас. Это, безусловно, будет быстрее, чем все, что вы можете сделать:

select DISTINCT id, tracker, time, result
from table;
  • 0
    Мне нужно записать все без исключения изменения результатов, чтобы это не сработало, к сожалению.

Ещё вопросы

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