Numărătoare și identificarea duplicatelor

sarcină
Vrei să știi dacă tabelul conține duplicate și câte dintre ele. Sau doriți să vedeți înregistrări care conțin valori duplicate.

Soluția
Utilizați contorul (interogarea sumară) care caută și afișează duplicate. Pentru a vedea înregistrările în care apar duplicate, combinați rezultatul cu tabela originală pentru a afișa înregistrările potrivite.







discuție
Să presupunem că site-ul dvs. conține o pagină de conectare care permite utilizatorilor să se adauge la lista de distribuție pentru a primi mesaje periodice cu cataloage de produse. Dar ați uitat să includeți un indice unic în crearea unui tabel și acum credeți că unii utilizatori s-au abonat la newsletter de mai multe ori. Poate că au uitat că sunt deja pe listă sau că cineva a decis să-și adauge prietenii care s-au înscris deja. În orice caz, datorită prezenței de intrări duplicate, faceți dublu cataloagele. Acesta este un cost suplimentar pentru dvs. și un neplăcut pentru destinatari.

Această secțiune vă arată cum să determinați dacă există duplicate în tabel, dacă sunt multe și cum să afișați intrări duplicate.

Pentru a determina dacă există duplicate în tabel, utilizați funcția pentru a obține informațiile sumare.


Metodele de obținere a totalurilor pot fi utile în identificarea și calcularea duplicatelor: înregistrări de grup folosind GROUP BY și numărarea rândurilor din fiecare grup utilizând COUNT (). De exemplu, să presupunem că destinatarii de directoare sunt enumerați în tabela cat_mailing:

mysql> SELECT * FROM cat_mailing;

+-----------+--------------+-----------------------------+
| | last_name | first_name | strada |
+-----------+--------------+-----------------------------+
| | Isaacson | Jim | Str. Fordam 515 Apt. 917 |
| | Baxter | Wallace | 57 3rd Ave. | |
| | McTavish | Taylor | 432 Râul Run |
| | Pinter | Marlene | Traseul apus de soare |
| | BAXTER | WALLACE | 57 3rd Ave. | |
| | Brown | Bartolomeu | 432 Râul Run |
| | Pinter | Marlene | Traseul apus de soare |
| | Baxter | Wallace | 57 3rd Ave. Apt 102 |
+-----------+--------------+-----------------------------+

Să presupunem că doriți să identificați duplicate pentru coloanele last_name și first_name, adică destinatarii cu aceleași nume sunt acceptați pentru aceeași persoană (desigur, aceasta este o imagine simplificată).


Iată interogările adesea folosite pentru a descrie tabelul și pentru a estima existența și numărul de duplicate:







• Numărul total de rânduri din tabel:

mysql> SELECT COUNT (*) Ca rânduri FROM cat_mailing;

• Numărul de nume diferite:

mysql> SELECT COUNT (DISTINCT last_name, first_name) AS "nume distincte"
-> FROM cat_mailing;

• Numărul de linii care conțin duplicate:

mysql> SELECT COUNT (*) - COUNT (DISTINCT ultim_name, first_name)
-> Numele "duplicat"
-> FROM cat_mailing;

• Procentajul înregistrărilor cu valori unice și non-unice:

mysql> SELECT COUNT (DISTINCT ultim_name, first_name) / COUNT (*)
-> AS "unic",
-> 1 - (COUNT (DISTINCT last_name, first_name) / COUNT (*))
-> AS "non-unic"
-> FROM cat_mailing;

Aceste interogări caracterizează măsura de distribuire a duplicatelor în set, dar nu arată exact ce valori se repetă.


Pentru a vedea intrările repetate ale tabelului cat_mailing, utilizați o interogare sumară care transmite intrări non-unice împreună cu contorul corespunzător:

mysql> SELECT COUNT (*) AS repetari, last_name, first_name
-> FROM cat_mailing
-> GROUP BY last_name, first_name
-> Având repetări> 1;

Interogarea conține o instrucțiune HAVING care restricționează ieșirea numai la acele nume care apar mai mult decât o dată. (Dacă omiteți această instrucțiune, veți obține și nume unice de care nu avem nevoie, deoarece suntem interesați doar de duplicate.) În general, pentru a identifica un set de valori duplicate, procedați în felul următor:

• Determinați care coloane conțin valori care pot fi repetate.

• Listați aceste coloane în lista de selecție adăugând COUNT (*).

• Listați aceste coloane în instrucțiunea GROUP BY.

• Adăugați o instrucțiune HAVING care șterge valori unice, cerând ca numărătoarele de grup returnate să fie mai mari decât una. Interogările construite pentru acest plan au următoarea formă:

SELECT COUNT (*), coloane list_
FROM table_name
GROUP BY list_columns
CU NUMĂRUL (*)> 1

Puteți genera cu ușurință astfel de interogări de căutare duplicate în program pentru numele tabelului specificat și un set non-gol de nume de coloane. Luați în considerare, de exemplu, o funcție pe Perl make_dup_count_query (), care generează o interogare pentru a găsi și a număra duplicate în coloanele specificate:

sub make_dup_count_query
numele meu ($ tbl_name, @col_name) = @_;
retur (
"SELECT COUNT (*),". se alăture (",", @col_name)
. "\ nFROM $ tbl_name"
. "\ nGROUP BY". se alăture (",", @col_name)
. "\ n COUNT COUNT (*)> 1"
);
>

Funcția make_dup_count_query () returnează o interogare ca un șir. Dacă o numiți așa:

$ str = make_dup_count_query ("cat_mailing", "last_name", "first_name");
atunci valoarea rezultată a $ str va fi:
SELECT COUNT (*), last_name, first_name
FROM cat_mailing
GROUP DE ultimul nume, first_name
CU NUMĂRUL (*)> 1

Acum, că șirul de interogare se află în fața dvs., puteți rula o interogare din scriptul care a generat șirul, îl puteți transmite unui alt program sau îl puteți scrie într-un fișier pentru o execuție ulterioară. Directorul dups pentru distribuția de rețete conține scriptul dup_count.pl, pe care îl puteți folosi pentru a testa funcția (acolo puteți găsi opțiuni în alte limbi).

mysql> CREATE TABLE tmp
-> SELECT COUNT (*) AS numar, last_name, first_name
-> FROM cat_mailing GROUP BY ultim_name, first_name NUMAI numar> 1;
mysql> SELECT cat_mailing. *
-> FROM tmp, cat_mailing
-> WHERE tmp.last_name = cat_mailing.last_name
-> AND tmp.first_name = cat_mailing.first_name
-> ORDER BY last_name, first_name;







Trimiteți-le prietenilor: