MYSQL: поиск и удаление похожих записей - Обновлено с примером - PullRequest
0 голосов
/ 23 ноября 2011

Я пытаюсь дедуплицировать таблицу, где я знаю, что есть «закрытые» (но не точные) строки, которые необходимо удалить.

У меня есть одна таблица с 22 полями, и уникальность может быть установлена ​​путем сравнения 5 из этих полей. Из оставшихся 17 полей (включая уникальный ключ) есть 3 поля, которые делают каждую строку уникальной, что означает, что правильный метод дедупликации не будет работать.

Я искал метод удаления нескольких таблиц, описанный здесь: http://blog.krisgielen.be/archives/111, но я не могу понять смысл последней строки кода (AND M1.cd * 100 + M1.track> M2.cd * 100 + M2.track), поскольку я не уверен, что достигает часть CD * 100 ...

Может ли кто-нибудь помочь мне с этим? Я подозреваю, что я мог бы лучше экспортировать все это в python, сделать что-то с этим, затем повторно импортировать это, но затем (1) я застрял в знании, как все же дедуплировать строку! и (2) мне пришлось разбить запись на куски, чтобы иметь возможность импортировать ее в mysql, так как он истекал через 300 секунд, так что это превратилось в целую версию, чтобы в первую очередь попасть в mysql .... (я очень новичок как в MySQL, так и в Python)

Таблица представляет собой дамп примерно из 40 файлов журналов из некоторого тестирования. Набор тестов для каждого журнала составляет около 20 000 файлов. Повторяющиеся значения - это либо условия теста, либо имя файла / параметры, либо результаты тестов.


    CREATE SHOW TABLE:

    CREATE TABLE `t1` (
     `DROID_V` int(1) DEFAULT NULL,
     `Sig_V` varchar(7) DEFAULT NULL,
     `SPEED` varchar(4) DEFAULT NULL,
     `ID` varchar(7) DEFAULT NULL,
     `PARENT_ID` varchar(10) DEFAULT NULL,
     `URI` varchar(10) DEFAULT NULL,
     `FILE_PATH` varchar(68) DEFAULT NULL,
     `NAME` varchar(17) DEFAULT NULL,
     `METHOD` varchar(10) DEFAULT NULL,
     `STATUS` varchar(14) DEFAULT NULL,
     `SIZE` int(10) DEFAULT NULL,
     `TYPE` varchar(10) DEFAULT NULL,
     `EXT` varchar(4) DEFAULT NULL,
     `LAST_MODIFIED` varchar(10) DEFAULT NULL,
     `EXTENSION_MISMATCH` varchar(32) DEFAULT NULL,
     `MD5_HASH` varchar(10) DEFAULT NULL,
     `FORMAT_COUNT` varchar(10) DEFAULT NULL,
     `PUID` varchar(15) DEFAULT NULL,
     `MIME_TYPE` varchar(24) DEFAULT NULL,
     `FORMAT_NAME` varchar(10) DEFAULT NULL,
     `FORMAT_VERSION` varchar(10) DEFAULT NULL,
     `INDEX` int(11) NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`INDEX`)
    ) ENGINE=MyISAM AUTO_INCREMENT=960831 DEFAULT CHARSET=utf8

Единственное уникальное поле - это PriKey, 'index'.

Уникальные записи можно установить, посмотрев на DROID_V, Sig_V, SPEED. NAME и PUID

Из ¬900000 строк у меня есть около 10000 дуплей, которые либо являются одним дубликатом записи, либо имеют до 6 повторений записи.


Примеры строк: как есть

    5;"v37";"slow";"10266";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/7";"image/tiff";"Tagged Ima";"3";"191977"
    5;"v37";"slow";"10268";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/8";"image/tiff";"Tagged Ima";"4";"191978"
    5;"v37";"slow";"10269";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/9";"image/tiff";"Tagged Ima";"5";"191979"
    5;"v37";"slow";"10270";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/10";"image/tiff";"Tagged Ima";"6";"191980"
    5;"v37";"slow";"12766";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/7";"image/tiff";"Tagged Ima";"3";"193977"
    5;"v37";"slow";"12768";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/8";"image/tiff";"Tagged Ima";"4";"193978"
    5;"v37";"slow";"12769";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/9";"image/tiff";"Tagged Ima";"5";"193979"
    5;"v37";"slow";"12770";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/10";"image/tiff";"Tagged Ima";"6";"193980"

Пример строки: как и должно быть

    5;"v37";"slow";"10266";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/7";"image/tiff";"Tagged Ima";"3";"191977"
    5;"v37";"slow";"10268";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/8";"image/tiff";"Tagged Ima";"4";"191978"
    5;"v37";"slow";"10269";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/9";"image/tiff";"Tagged Ima";"5";"191979"
    5;"v37";"slow";"10270";;"file:";"V1-FL425817.tif";"V1-FL425817.tif";"BINARY_SIG";"MultipleIdenti";"20603284";"FILE";"tif";"2008-11-03";;;;"fmt/10";"image/tiff";"Tagged Ima";"6";"191980"

Обратите внимание, что из столбца индекса в конце видно, что я вырезал некоторые другие строки - я выделил только очень небольшой набор повторяющихся строк. Пожалуйста, дайте мне знать, если вам нужно больше «шума» от остальной части DB

Спасибо.

1 Ответ

1 голос
/ 03 февраля 2012

Я нашел исправление - используя функцию count, я использовал COUNT(*), который просто возвращал все в таблицу, используя функцию COUNT (distinct NAME), я могу отсеять дублирующиеся строки которые соответствуют критерию дублирования (как указано в поле выбора в предложении WHERE)

Пример:

SELECT `PUID`,`DROID_V`,`SIG_V`,`SPEED`, COUNT(distinct NAME) as Hit FROM sourcelist, main_small WHERE sourcelist.SourcePUID = 'MyVariableHere' AND main_small.NAME =  sourcelist.SourceFileName 
GROUP BY `PUID`,`DROID_V`,`SIG_V`,`SPEED` ORDER BY `DROID_V` ASC, `SIG_V` ASC, `SPEED`;
...