![]() |
![]() |
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 | Да, счастья не было:-) |