Удаление "дублей" в MySQL

ariran

Новичок
Добрый день

Задача: нужно занести пользователей в одну таблицу MySQL

Ситуация: часть пользователей "содержится" в текстовых файлах типа user01.vars (условно таких файлов 100 штук. 1 юзер = 1 файл) а часть юзеров в екселевском файле (условно записей (строк) в файле 200 1 строка=1юзер)

Теперь о проблемах:
1. файл *.vars содержит всю информацию о пользователе (ФИО, почту, компанию, должность и т.д.)
2. в екселевском файле информация о пользователе ограничена: только ФИО и почта
3. в екселевском файле есть строки, которые соответствуют определенному файлу *.vars (одинаковый e-mail)

На данный момент я занес в одну общую таблицу пользователей из файлов *vars и из екселевского файла (при этом uid-ы екселевских юзеров больше (из екселя записываются в конец таблицы после того, как в таблицу внесена информация из файлов *vars.

согласно пункту 3 Проблем надо удалить "дубликаты" записей. в качестве определяющего элемента у нас e-mail.


попробовал ALTER IGNORE TABLE `users_reform` ADD UNIQUE(mail) в результате выходит, что дублей нет (но это не так)
более того, если сделать запрос SELECT * FROM `users_reform` WHERE `mail` = "[email protected]" то в результате выходит только одна запись а их там 100% две. на пробелы проверял выделением мышью - пробелов нет.

в чем может быть проблема?
 

ariran

Новичок
ну это первое что пришло в голову раз оно просто select-ом не показывает 2 значения, значит они не совпадают )

теперь по запросу синтаксис верный? users_reform_duplicate_delete - имя таблицы, mail - имя поля в котором записаны e-mail

select mail, count(*)
from `users_reform_duplicate_delete`
group by mail
order by count(*) desc
having count(*)>1

при его запуске через phpmyadmin выходит вот это:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'having count(*)>1 LIMIT 0, 50' at line 5

это чего ему не хватает? если что количество строк в таблице 58000 из них 17000 это из *vars остальные 41 из екселя (в их числе и 17000 дублей *vars")
 

С.

Продвинутый новичок
SELECT * FROM users_reform ORDER BY mail

и пробежаться глазками. 300 записей всего-то, разовая операция. Чего тут огород городить?
 

ariran

Новичок
SELECT * FROM users_reform ORDER BY mail

и пробежаться глазками. 300 записей всего-то, разовая операция. Чего тут огород городить?
100 и 200 для примера, что во вторую подгруппу входит первая, но не со всеми данными. по факту это 17000 и 58000 суммарно. все еще хочете глазками? )
 

ariran

Новичок
Разницу видно?
LIMIT в ошибке откуда взялся? В запросе его нет.
странно, вроде копировал отсюда... лимит подставляется phpmyadminom кажись (как его убрать кстати? эта строка во все запросы с selectom добавляется)
http://clip2net.com/s/4JIMi7

MySQL вернула пустой результат (т.е. ноль строк). ( Запрос занял 1.3168 сек. )
SELECT mail, COUNT( * )
FROM users_reform_duplicate_delete
GROUP BY mail
HAVING COUNT( * ) >1
ORDER BY COUNT( * ) DESC
LIMIT 0 , 50
 

ariran

Новичок
я сначала ошибся потом отредактировал
значит дубликатов нет
они есть и походу проблема в пробелах. точнее не в пробелах а в переносах строк \n
я выгрузил дамп в scv формат и отметил галочку "удалять переносы строки" или что-то в этом роде. после чего уже в екселе удалил дубли. и из 58000 записей осталось 33000 записей, что примерно соответствует действительности.

правильно я понимаю, что чтобы воспользоваться твоим кодом мне при записи в таблицу данных из файлов и екселевского файла надо будет добавить везде строку типа

$mail=$row['mail'];
$mail = str_replace("\n", "", $mail);
 

ariran

Новичок
всем привет. это снова я )
как и предполагалось проблема была в \n я доработал малость скрипт переноса (добавил в каждую переменную str_replace("\n", "", $поле);) после чего применил запрос fixxxer-а
в результате имеем следующее:
http://clip2net.com/s/4JZXHu

Отображает строки 0 - 49 ( 25,101 всего, Запрос занял 2.8051 сек.)
SELECT mail, COUNT( * )
FROM users_reform_58271duplicates
GROUP BY mail
HAVING COUNT( * ) >1
ORDER BY COUNT( * ) DESC

и теперь вопрос а что с этим делать? мне же надо удалить дубли строк, а не посчитать.

на пробу сделал запрос ALTER IGNORE TABLE `users_reform_58271duplicates` ADD UNIQUE(mail) вроде он удалил 25101 записей
 

fixxxer

К.О.
Партнер клуба
в результате имеем следующее
не надо тут картинок. ты бы еще фломастером на салфетку перерисовал и сфоткал. консольный вывод и копипаст текста.

вроде он удалил
то есть вместо того, чтобы запустиь тот же запрос еще раз и проверить, надо бежать на форум в поиске телепатов?

голову уже включай.
 

ariran

Новичок
В самом начале я вроде ясно написал, что мне надо удалить дубликаты, а не посчитать их или проверить, что они есть. То что дубликаты есть и что их по 2 штуки я заведомо знаю и без запроса.

После ALTER IGNORE TABLE я, естественно. проверил твоим запросом - дублей нет.
 
Сверху