У меня есть таблица, в которой я хочу удалить повторяющиеся строки в соответствии с 5 полями. Эти поля: origin_id
, destination_id
, market_id
, cabin
, tripType
. Что я хочу сделать, так это удалить все записи с одинаковыми 5 полями, кроме одной записи с самым большим created_at
. Я хочу иметь только одну запись для каждых 5 полей. После удаления дубликатов я создам уникальный индекс, но пока я не могу этого сделать из-за дубликатов.
То, что у меня есть, это этот запрос, но он, похоже, не работает:
DELETE FROM fares WHERE id NOT IN(
SELECT f1.id FROM (SELECT * FROM fares) AS f1
INNER JOIN (
SELECT origin_id,destination_id,market_id,cabin,tripType,MAX(created_at) AS maxDate FROM fares
GROUP BY origin_id,destination_id,market_id,cabin,tripType
) AS f2 ON f2.origin_id=f1.origin_id AND f2.destination_id=f1.destination_id AND
f2.market_id=f1.market_id AND f2.cabin=f1.cabin AND f2.tripType=f1.tripType
WHERE f1.created_at=f2.maxDate
GROUP BY f1.origin_id,f1.destination_id,f1.market_id,f1.cabin,f1.tripType
)
Приведенный выше запрос удаляет только 500 строк, но у меня 8k дубликатов. Что я захватываю с помощью следующего запроса.
SELECT SUM(f.numberOfFares) AS duplicateFares FROM (
SELECT origin_id,destination_id,market_id,cabin,tripType,COUNT(1) AS numberOfFares FROM fares
GROUP BY origin_id,destination_id,market_id,cabin,tripType
HAVING count(1)>1
) AS f
Запрос выше приводит к этому
Я хочу иметь 1 запись для origin_id
, destination_id
, market_id
, cabin
, tripType
группа
Думаю, проблема в записях с одинаковым значением created_at
SQLFiddle