К списку форумов К списку вопросов
К спецам по MySQL
ua6ap
13.04.2004 - 21:51
При некорректном переносе базы "ric" (56000 записей) вкрались двойные записи. При выполннении запроса: select CALL_, COUNT(*) as total FROM ric GROUP BY CALL_ ORDER BY total DESC, CALL_ LIMIT 300; в колонке total число 2 присутствует в 250 строках.
Может кто посоветует умный запрос, который найдет всех двойников и удалит одного из них. Будет ли это действие корректным. Я плохой специалист по MySQL и могу оперировать только с помощью phpMyAdmin.
Спасибо за любой ответ.
Уверенный
1 - 13.04.2004 - 23:54
ПО поводу умных запросов смотри тут:
http://www.google.com/search?q=mysql+delete+duplicate+records
 
Если ничего не найдешь - напиши, подумаем.
DIVЕR
2 - 14.04.2004 - 08:44
По ссылке Уверенного несколько решений:
 
1. просто импортировать все записи в таблицу с уникальным индексом, в данном случае как мне удалось понять, это поле CALL_. Так вот, надо создать временную таблицу (с такой же структурой и уникальным полем CALL_) и просто добавить туда все записи. Написано, что дублирующиеся записи просто не добавятся. Хр%н там =) У меня MySQL после первой дублирующейся записи отказался дальше обрабатывать запрос. Поэтому я сделал так:
 
INSERT INTO temp2
SELECT DISTINCT * FROM temp
 
И всё, добавились только уникальные ряды =)
 
 
 
2. Способ, заключающийся в выявлении именно дублирующихся записей:
SELECT *, count(*) cnt FROM tableName
GROUP BY fieldname1, fieldname2, ....
HAVING cnt > 1
 
This will return all the records in the tableName more than 1 time. Include all the fields except the auto increment field in GROUP BY part.
 
Rest is trivial
 
А вот что сделать дальше?? "Rest is trivial" - имеется ввиду, что удалить из исходной таблицы эти самые выявленные записи? Наверное, делать надо этот SELECT во временную таблицу, а потом сравнить две таблицы (исходную и временную) и удалить только те записи из исходной таблицы, которые присутствуют во временной %))
 
 
ИМХО, второй способ предпочтительней когда количество записей исчисляется миллионами (т.е. копировать туда-сюда все записи западло, а манипулировать только дубликатами)...
ua6ap
3 - 15.04.2004 - 23:19
2й Способ прекрасно выбрал всех двойников, однако phpMyAdmin при таком запросе показывает два столбца CALL_ и cnt, но не выставляет чекбоксов. А можно было бы сделать легко - Отметить все / С отмеченными: удалить. Хотя неизвестно, будет удалена одна запись или две...
Как изменить запрос SELECT CALL_, count(*) cnt FROM ric GROUP BY CALL_ HAVING cnt > 1; так, чтоб phpMyAdmin предложил произвести какие либо действия с выбранными?
Уверенный
4 - 15.04.2004 - 23:57
Лучше всего для подобных операций попросить кого-нибудь знакомого с командной строкой юникс и базами данных помочь - иначе можно потерять все вообще. Ну и конечно копию сделать в любом случае. phpmyadmin тут не игрок ИМХО.
DIVЕR
5 - 16.04.2004 - 12:52
Почему бы не попробовать 1-й способ??
Просто создаёшь таблицу с такой же структурой (для этого ничего выдумывать НЕ НАДО - экспортируешь только структуру таблицы в phpMyAdmin, берёшь выдаваемый запрос, меняешь ТОЛЬКО имя создаваемой таблицы в запросе и выполняешь его). Это будет твой временная таблица. Туда и делай INSERT. Потом переименовываешь исходную таблицу во что-нибудь "бэкапное" (на всякий её надо сохранить), а временную таблицу - в имя исходной.
И всё!
Пробуй...
ua6ap
6 - 16.04.2004 - 20:52
Что то очень просто... Попробовал, при инсерте получил ошибку:#1136 - Column count doesn't match value count at row 1
DIVЕR
7 - 16.04.2004 - 22:46
Тогда попробуй перечислить все поля в запросе INSERT-SELECT:
(ведь ключевое поле CALL_?)
 
INSERT INTO temp2
SELECT DISTINCT CALL_, field1, field2, ... FROM temp
ua6ap
8 - 17.04.2004 - 00:08
Все, без помощи хостера не обойтись. Процесс вставки убивается:#1053 - Server shutdown in progress. Вроде таблица небольшая - 16MB (вся база 54MB), а 30сек работы скрипта нехватает:-(
Спасибо всем за советы.
Mips
9 - 17.04.2004 - 11:04
set_time_limit(300); поставь в первой строке и будет тебе счастье... минут на пять ;)
OF
10 - 05.05.2004 - 09:46
Хехе :)
Не будет ему счастья.. Некоторые хостеры железно устанавливают время работы процесса.. И даже память...
ua6ap
11 - 06.05.2004 - 19:09
Да, счастья не было:-)

К списку вопросов на форуме Веб-дизайн

>>