У меня был хороший взгляд, но havnt смог найти решение, надеясь, что кто-то может помочь с этим.
У меня есть таблица результатов MySQL из внутреннего приложения регистрации, которое записывает результат из процедуры проверки, существует ряд процедур проверки, которые идентифицируются с столбцом трекера:
id (int)(PK), tracker (int), time (timestamp), result (int)
Результат должен быть записан только в том случае, если предыдущий результат не является тем же, но нужно только внести изменения. К сожалению, это было проигнорировано, когда оно было построено (в спешке) месяц назад, и результаты были записаны вслепую без каких-либо проверок предыдущих результатов. Это теперь было записано, но у меня все еще осталось несколько тысяч строк, из которых значительное число - это повторяющиеся записи, и я после этого очистил их, чтобы просто оставить точки изменения.
Поэтому мне нужно пройти через каждую строку, посмотреть на предыдущий результат, записанный этим трекером, и удалить строку, если она та же, это немного превышает мой опыт работы с MySQL, и попытки, которые я сделал до сих пор, были довольно бедный!
Может ли кто-нибудь помочь?
Использование:
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 )
Я думаю, вам нужен уникальный индекс в таблице:
ALTER IGNORE TABLE table ADD UNIQUE INDEX (tracker, time, result)
http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
При добавлении новых строк в качестве вставок, которые будут дублировать существующий ключ (трекер, время, результат), вам придется использовать INSERT IGNORE...
.
Есть жалобы, что это выполняется медленно, но это, вероятно, не влияет на вас. Это, безусловно, будет быстрее, чем все, что вы можете сделать:
select DISTINCT id, tracker, time, result
from table;