Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > как удалить дубликаты записей в таблице?


Автор: Coder 20.8.2007, 02:32
нужно удалить строки, которые равны по всем поля (кроме id). как это сделать?

Автор: Akina 20.8.2007, 08:44
Погоди... если есть 2 одинаковых (кроме ID) записи, надо удалить одну или обе?

Автор: belousov 20.8.2007, 10:13
distinct не подойдет?

Автор: Coder 21.8.2007, 01:42
Akina
поля полностью одинаковы, а ID разные (т.к. записи пришли в разное время) и нужно удалить все кроме одной. повторений может быть не 2, а 8 например.


belousov
не знаю, как его сюда привинтить.

Добавлено через 3 минуты и 14 секунд
Код

row0
id: 1
user_id: 1
data: 3718

row1
id: 2
user_id: 2
data: 1332

row2
id: 3
user_id: 1
data: 3718


это упрощенное представление. нужно удалить row0 или row2.

Автор: muzer 21.8.2007, 11:02
Если у вас не несколько-десятков-миллионная таблица, и операция единовременная, а не еже_какая-нить, то самый быстрый и простой вариант:
Код

CREATE TABLE new_table LIKE table;
INSERT INTO new_table SELECT id,user_id,data FROM table GROUP BY user_id,data;
RENAME TABLE table TO old_table,new_table TO table;
DROP TABLE old_table;


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

Автор: Akina 21.8.2007, 15:03
Цитата(Coder @  21.8.2007,  02:42 Найти цитируемый пост)
нужно удалить все кроме одной

Кроме КАКОЙ одной? Самой старой? самой свежей? Самой длинной? Пофиг какой? ставь задачу нормально - у нас все телепаты в отпусках.

Автор: muzer 21.8.2007, 20:49
Цитата(Akina @  21.8.2007,  16:03 Найти цитируемый пост)
Кроме КАКОЙ одной? Самой старой? самой свежей? Самой длинной? Пофиг какой?

Общий вариант решения от этого никак не зависит вообще-то smile Если решение требует ORDER BY, то найти поле, по которому можно отсортировать не проблема.

Автор: Coder 22.8.2007, 02:45
Цитата(Akina @  21.8.2007,  23:03 Найти цитируемый пост)
Кроме КАКОЙ одной? Самой старой? самой свежей? Самой длинной? Пофиг какой? ставь задачу нормально - у нас все телепаты в отпусках.

Ну да - пофиг...

muzer, +1

Автор: fidres 18.9.2007, 14:43
а нахря те тогда одни идэшники?
по мне так проще сделать проверку на вводимые данные, чтоб не было повторений.
а базы туда-сюда култырить - тоже как-то не выход, по-моему...
сделай у клиента проверку данных при попытке запостить запрос в базу.
пусть прочекает базу по определённому ключу и при ненахождении оного - постит в базу что угодно.
(хотя, всё равно не возьму в толк нахрена в базе одни идэшники без данных полей?!)
ещё проще можно сделать (хотя это и излишне) проверку, если какую-то часть инфы держать на стороне клиента до поры до времени...
потом, когда уже все данные куска базы будут сложены в один, можно запостить целый блок проверенной и упорядоченной инфы.
правда такой вариант не подходит, если инфа должна оперативно изменятся непосредственно в БД на серваке...
но тоже можно формировать какие-то отдельные, небольшие кусочки инфы и потом уже пытатся отправить их на сервак.
кстати, где-то помнится я здесь видал метод сжатия БД...
вполне возможно, что там применяется что-нибудь похожее...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)