ПредишенСледващото

задача
Вие искате да знаете, ако таблица съдържа дубликати, и колко от тях. Или искате да видите на записите, които съдържат дублиращи се стойности.

решение
Използвайте брояч (обща заявка), която търси и показва дубликати. За преглед на записите в които има дубликати, слеят резултата от оригиналната таблица за показване на съвпадение на записи.

дискусия
Да приемем, че вашия уеб сайт съдържа регистрация страница, която позволява на потребителите да добавят сами в пощенския списък получавате периодични съобщения от продуктовия каталог. Но сте забравили да създадете таблица включва уникален индекс, а сега мисля, че някои от потребителите се абонирали за бюлетина няколко пъти. Mozhetbyt, те са забравили, че вече съществуват в списъка и може би някой реши да добави приятелите му, които вече са се регистрирали за себе си. Във всеки случай, благодарение на наличието на дублирани записи, които изпращате две каталози. Това е допълнителен разход за вас и неудобство на получателя.

Този раздел описва как да се определи дали е налице дублиране на маса, ако много от тях и как да получите записи дублирани.

За да се определи дали е налице дублиране на маса, използвайте функцията за получаване на окончателната информация.


Методи за получаване на резултатите могат да бъдат полезни при откриването и преброяването на дубликати: групиране на записи, използвайки ГРУПА ОТ и изчисляват ред във всяка група се използва Брой (). Например, да предположим, че получателите, посочени в таблицата на директория cat_mailing:

MySQL> SELECT * ОТ cat_mailing;

+-----------+--------------+-----------------------------+
| last_name | first_name | улица |
+-----------+--------------+-----------------------------+
| Исаксън | Джим | 515 Fordam Св Ап. 917 |
| Бакстър | Уолъс | 57 третата Ave. |
| Мактавиш | Тейлър | 432 River Run |
| Пинтер | Марлене | 9 Sunset пътека |
| BAXTER | Уолъс | 57 третата Ave. |
| Браун | Вартоломей | 432 River Run |
| Пинтер | Марлене | 9 Sunset пътека |
| Бакстър | Уолъс | 57 третата Ave. Apt 102 |
+-----------+--------------+-----------------------------+

Да предположим, че искате да се идентифицират дубликати за last_name и first_name колони, т.е. получателите със същите имена са взети за едно и също лице (разбира се, това е една опростена картина).


Това са въпроси, които често се използват за описване на масата и да се оцени наличието и броя на повторенията:

• Общ брой редове в таблицата:

MySQL> SELECT COUNT (*) като редове ОТ cat_mailing;

• Броят на различни имена:

MySQL> SELECT COUNT (DISTINCT last_name, first_name) като "различни имена"
-> ОТ cat_mailing;

• Брой редове, съдържащи два екземпляра:

MySQL> SELECT COUNT (*) - COUNT (DISTINCT last_name, first_name)
-> като "дублиращи се имена"
-> ОТ cat_mailing;

• Делът на записи с уникални и не са уникални стойности:

MySQL> Изберете COUNT (DISTINCT last_name, first_name) / COUNT (*)
-> Като "уникален"
-> 1 - (COUNT (DISTINCT last_name, first_name) / COUNT (*))
-> Като "не-уникален"
-> ОТ cat_mailing;

Тези искания се характеризират с разпространението на дубликат мярка в комплекта, но не показват това, което стойностите се повтарят.


За да видите дублирани записи cat_mailing маса, използвайте общо искане за извеждане извън уникални записи със съответната брояча:

MySQL> SELECT COUNT (*) като повторения, last_name, first_name
-> ОТ cat_mailing
-> ГРУПА ОТ last_name, first_name
-> КАТО повторенията> 1;

КАТО заявка съдържа инструкция за ограничаване на продукцията само до тези имена, които се срещат повече от веднъж. (Ако пропуснете това твърдение, то ще бъде изтеглен и уникално име, ние не се нуждаем, защото ние се интересуваме само от дубликати.) Като цяло, да се идентифицира набор от дублиращи се стойности, следвайте тези стъпки:

• Определете кои колони съдържат стойности, които могат да бъдат повторени.

• Списък на колоните в списъка за избор, добавяйки, COUNT (*).

• Списък графи в GROUP BY изявление.

• Добавете КАТО изявлението премахва уникални стойности, настоявайки, че групата се завръща гишета бяха edinitsy.Postroennye по-дълго на заявките за плана са следния вид:

SELECT COUNT (*), column_list
от таблица
GROUP BY column_list
КАТО COUNT (*)> 1

Можете лесно да генерирате такива искания търсите дублирани в програмата за посоченото име на маса и колона имената на които не са празни комплекти. Помислете например за в Perl make_dup_count_query (), който ще генерира заявка за намиране и преброяване на дубликати в определени колони:

под make_dup_count_query
ми ($ tbl_name, @col_name) = @_;
завърне (
"SELECT COUNT (*)". се присъедини ( "", @col_name)
. "\ NFROM $ tbl_name"
. "\ NGROUP ОТ". присъединят ( "", @col_name)
. "\ NHAVING COUNT (*)> 1"
);
>

make_dup_count_query () връща искането като низ. Ако го наричат ​​по този начин:

Ул $ = make_dup_count_query ( "cat_mailing", "last_name", "first_name");
получената стойност ще бъде $ ул:
МАРКИРАЙ COUNT (*), last_name, first_name
ОТ cat_mailing
GROUP BY last_name, first_name
КАТО COUNT (*)> 1

Сега, след като низа на заявката пред вас, не можете да завършите заявката си, за да се създаде скрипт линия, за да се прехвърли в друга програма или пишете във файл за по-късно изпълнение. Каталог dups рецепти разпределение съдържа dup_count.pl скрипт, който може да се използва за тестване на функция (където можете да намерите и други езикови версии).

MySQL> CREATE TABLE ТМР
-> SELECT COUNT (*) като брой, last_name, first_name
-> ОТ cat_mailing ГРУПА ОТ last_name, first_name КАТО брой> 1;
MySQL> SELECT cat_mailing. *
-> ОТ ТМР, cat_mailing
-> КЪДЕТО tmp.last_name = cat_mailing.last_name
-> И tmp.first_name = cat_mailing.first_name
-> РЕД ОТ last_name, first_name;

Подкрепете проекта - споделете линка, благодаря!