Как удалить дубликаты строк в моей базе данных MySQL?(Оставьте тот, у кого наименьший основной идентификатор) - PullRequest
2 голосов
/ 02 ноября 2010

Допустим, я хочу сначала выбрать строки, которые имеют одинаковые download_link.Затем я хочу сохранить тот, который имеет наименьший первичный идентификатор, и выбросить остальные.

Есть ли простой оператор SQL для этого?Будет ли это работать?

delete from mytable
where id not in
    (select min(id)
     from mytable
     group by download_link);

Ответы [ 4 ]

4 голосов
/ 02 ноября 2010

Что-то вроде этого должно работать:

DELETE FROM `table` 
WHERE `id` NOT IN (
    SELECT MIN(`id`) 
    FROM `table`
    GROUP BY `download_link`)

Просто чтобы быть в безопасности, перед выполнением фактического запроса на удаление, вы можете сделать эквивалентный выбор, чтобы увидеть, что удаляется:

SELECT * FROM `table` 
WHERE `id` NOT IN (
    SELECT MIN(`id`) 
    FROM `table`
    GROUP BY `download_link`)
2 голосов
/ 02 ноября 2010

Вам не нужны временные таблицы или подзапросы. Вы можете сделать это с помощью простого соединения:

DELETE t0
FROM mytable AS t0
JOIN mytable AS t1 ON t1.download_link=t0.download_link AND t1.id<t0.id;

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

1 голос
/ 02 ноября 2010

Ошибка 1093 мешает вашему подходу работать в MySQL. Обходной путь создания временной таблицы:

  CREATE TEMPORARY TABLE table_purge SELECT MIN(id) id FROM table GROUP BY download_link;
  DELETE FROM table where id NOT IN (SELECT id FROM table_purge);

Отредактировано, чтобы добавить альтернативный обходной путь, который не включает явную временную таблицу. Предположительно это работает, потому что план выполнения запроса естественным образом создает временную таблицу в любом случае:

 DELETE table
  FROM table 
  NATURAL JOIN (
      SELECT id, download_link
      FROM table
      NATURAL JOIN (
          SELECT MIN(id) min_id, download_link
          FROM table
          GROUP BY download_link ) table_min
      WHERE id > min_id
  )  table_to_purge;
0 голосов
/ 02 ноября 2010

попробуйте следующий запрос

 delete from table where id not in 
 (select * from 
      (select min(id) from table group by download_link)
 SWA_TABAL)

Отлично работает с mysql 5.0.x

...