2016-07-29 3 views
1

Я хочу удалить все строки с одинаковыми значениями во всех столбцах, кроме id, за исключением строки с наименьшим id.
Учитывая эти данные:Удалите повторяющиеся строки в mysql, сохраняя только то, что с самым низким id

id year file name language download 
1 2014 a x  h  d 
2 2014 a c  i  d 
3 2014 a x  h  d 
4 2014 a x  h  d 
5 2015 b y  j  d 
6 2015 b y  j  d 
7 2015 b y  j  d 

Здесь я хочу, чтобы удалить 3 и 4 (оставив 1 - самый низкий идентификатор), и удалить 6, 7 (выезд 5).

«Соответствие» означает, что обе строки имеют одинаковые «год», «файл», «имя», «язык» и «загрузка».

Может быть более 10 повторяющихся строк. Я хочу удалить все строки, но сохраняя самую низкую строку id. мульти-стол

+0

Как минимум 1 ряд ??? – Strawberry

+0

да. сохраняя самую низкую нижнюю строку id – Jaki

+0

, это не сработает ... – Jaki

ответ

1

Использовать в MySQL удалить синтаксис с автообъединение:

delete b 
from mytable a, mytable b 
where b.year = a.year 
and b.file = a.file 
and b.name = a.name 
and b.language = a.language 
and b.download = a.download 
and b.id > a.id -- this condition picks the higher id(s) for deletion 

Это должно выполнять достаточно хорошо, так как это по сути одно соединение.

+0

Да, это сработало для меня. Спасибо – Jaki

+0

Я запустил команду, но это занимает много времени. У меня есть большая база данных более двух миллионов строк. – Jaki

+0

@jaki помещает индекс в зависимости от того, какой столбец не-id имеет наибольшее количество различных значений. Если количество разных значений меньше, чем около 100, сделайте индекс на 2 столбца, а второй столбец будет не-id-столбцом, а второе число будет иметь разные значения. – Bohemian

1
DELETE 
    FROM myTable a 
WHERE EXISTS (SELECT b.id 
       FROM myTable b 
       WHERE a.year = b.year 
       AND a.file = b.file 
       AND a.name = b.name 
       AND a.language = b.language 
       AND a.download = b.download 
       AND a.id > b.id);