Как удалить все, кроме одной строки в SQL - PullRequest
4 голосов
/ 10 сентября 2011

Я хотел бы удалить все, кроме одной строки, но в сочетании с PHP.

Я думаю, что это будет более простое решение для моей проблемы, а именно удаление дублирующейся информации.

Хорошо ... Я только что понял, что я уже сделал, это дерьмо.

По сути, у меня есть таблица (dev_discs), и я хочу найти дубликаты в столбце "discReference" изатем удалите все, кроме одного, оставив один оставшийся ряд.

Есть ли простой запрос для этого?Я сталкивался с подобными ситуациями в сети, и все они сложны ... Я не думаю, что это очень сложный сценарий.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2011
DELETE FROM discs dd WHERE EXISTS
    ( SELECT * FROM discs d2
     WHERE d2.discReference = dd.discReference
     AND d2.rownumber < dd.rownumber
    );

"rownumber" - это внутренний идентификатор, который предоставляется вашей СУБД. Можно назвать тид, оид.

0 голосов
/ 10 сентября 2011

Не легкий путь, AFAIK.С PHP это не должно быть слишком сложно (я не могу придумать, как вы можете сделать это легко, просто используя SQL).

  1. Создайте новую таблицу с такой же структурой, как у оригиналаone:

    CREATE TABLE dev_discs_noduplicates (...);

  2. Извлечь все недублированные данные из исходной таблицы с помощью предложения GROUP для устранения дубликатов:

    SELECT * FROM dev_discs WHERE 1 GROUP BY dupe_col1, dupe_col2;

  3. Перебрать результаты и вставить их в новую таблицу:

    ВСТАВИТЬ INTO dev_discs_noduplicates ...;

  4. Удалить старую таблицу

    DROP TABLE dev_discs;

  5. Переименовать новую таблицу:

    RENAMETABLE dev_discs_nodulicates TO dev_discs;

[EDIT]

Поскольку @xanatos справедливо отметил возможную потерю отношений в базе данных, вот альтернативное решение, включающее SQL и PHP.

Сначала выберите уникальные строки:

SELECT id FROM dev_discs GROUP BY col1, col2;

HСохраните их в массиве PHP, разверните их и используйте в запросе на удаление:

DELETE FROM dev_discs WHERE (id) NOT IN ( @arr );

Это должно решить все возможные проблемы.

...