Másolatok számlálása és azonosítása

feladat
Azt szeretné tudni, hogy a táblázat tartalmaz-e duplikátumokat, és hányat. Vagy olyan rekordokat szeretne látni, amelyek duplikált értékeket tartalmaznak.

A megoldás
Használja a számlálót (összefoglaló lekérdezés), amely megkeresi és megjeleníti a másolatokat. Ha meg szeretné tekinteni azokat a rekordokat, amelyekben a másolatok megtörténtek, akkor az eredményt az eredeti táblával kombinálva jelenítse meg a megfelelő rekordokat.

megbeszélés
Tegyük fel, hogy webhelye egy bejelentkezési oldalt tartalmaz, amely lehetővé teszi a felhasználók számára, hogy felvehessék magukat a terjesztési listára, hogy időszakos üzeneteket kapjanak a termékkatalógusokkal. De elfelejtettél egy egyedi indexet felvenni egy táblázathoz, és most úgy gondolod, hogy egyes felhasználók többször is feliratkoztak a hírlevélre. Talán elfelejtették, hogy már szerepelnek a listán, vagy valaki úgy döntött, hogy hozzáadja a már feliratkozott barátait. Mindenesetre a duplikált bejegyzések jelenlétének köszönhetően kétszer továbbítja a katalógusokat. Ez többletköltséget jelent Önnek és kényelmetlenséget okoz a címzetteknek.

Ez a rész megmondja, hogyan állapítható meg, hogy vannak-e duplikátumok a táblázatban, függetlenül attól, hogy sokak-e, és hogyan jeleníthet meg ismétlődő bejegyzéseket.

Annak megállapításához, hogy vannak-e duplikátumok a táblázatban, használja a funkciót az összefoglaló információk beszerzéséhez.


Az összértékek megszerzésének módszerei hasznosak lehetnek a másolatok azonosításában és kiszámításában: csoportos feljegyzések a GROUP BY használatával, és a COUNT () segítségével COUNT számok megszámolása az egyes csoportokban. Tegyük fel például, hogy a címzettek szerepelnek a cat_mailing táblában:

mysql> SELECT * FROM cat_mailing;

+-----------+--------------+-----------------------------+
| | last_name | first_name | utca
+-----------+--------------+-----------------------------+
| | Isaacson | Jim | 515 Fordam St. Apt. 917 |
| | Baxter | Wallace | 57 3rd Ave. | |
| | McTavish | Taylor | 432 folyami futás
| | Pinter | Marlene | 9 naplemente nyomvonal |
| | BAXTER | WALLACE | 57 3rd Ave. | |
| | Barna Bartholomew | 432 folyami futás
| | Pinter | Marlene | 9 naplemente nyomvonal |
| | Baxter | Wallace | 57 3rd Ave. Apt 102 |
+-----------+--------------+-----------------------------+

Tegyük fel, hogy meg akarja azonosítani a duplikátumokat a last_name és az first_name oszlopokhoz, vagyis ugyanazokkal a névvel rendelkező címzetteket ugyanaz a személy fogadja el (természetesen ez egyszerűsített kép).


Itt találhatók a lekérdezések, amelyeket gyakran a táblázat leírására használnak, és becslése a másolatok létezésének és számának:

• A táblák összes sorának száma:

mysql> SELECT COUNT (*) AS sorok FROM cat_mailing;

• Különböző nevek száma:

mysql> SELECT COUNT (DISTINCT last_name, first_name) AS "különálló nevek"
-> FROM cat_mailing;

• A másolatokat tartalmazó sorok száma:

mysql> SELECT COUNT (*) - COUNT (DISTINCT last_name, first_name)
-> AS "ismétlődő nevek"
-> FROM cat_mailing;

• Az egyedi és nem egyedi értékekkel rendelkező rekordok százalékos aránya:

SELECT COUNT (DISTINCT last_name, first_name) / COUNT (*)
-> AS "egyedi",
-> 1 - (COUNT (DISTINCT last_name, first_name) / COUNT (*))
-> AS "nem egyedi"
-> FROM cat_mailing;

Ezek a lekérdezések jellemzik a készletben lévő másolatok elosztásának mértékét, de nem mutatják pontosan, hogy mely értékeket ismételjük meg.


A cat_mailing táblázat ismétlődő bejegyzéseinek megtekintéséhez használja az összefoglaló lekérdezést, amely nem egyedi bejegyzéseket ad ki a megfelelő számlálóval együtt:

SELECT COUNT (*) AS ismétlések, last_name, first_name
-> FROM cat_mailing
-> GROUP BY utolsó_név, first_name
-> HAVING ismétlések> 1;

A lekérdezés tartalmaz egy HAVING utasítást, amely csak azokra a nevekre korlátozza a kimenetet, amelyek többször is előfordulnak. (Ha elhagyod ezt az utasítást, egyedi neveket is kapsz, amelyekre nincs szükségünk, mert csak duplikációk érdekelnek.) Általában a kettős értékek azonosításához tegye a következőket:

• Határozza meg, hogy mely oszlopok tartalmazhatnak ismétlődő értékeket.

• Adja meg ezeket az oszlopokat a kiválasztási listában a COUNT (*) hozzáadásával.

• Sorolja fel ezeket az oszlopokat a GROUP BY utasításban.

• Adjon hozzá egy HAVING utasítást, amely törli az egyedi értékeket, és előírja, hogy a visszaadott csoportos számlálók nagyobbak legyenek. A tervhez létrehozott lekérdezéseknek a következő formája van:

SELECT COUNT (*), list_columns
FROM táblázat_neve
GROUP BY list_columns
HOSSZABBÍTÁS (*)> 1

Könnyedén létrehozhat ilyen ismétlődő keresési lekérdezéseket a programban a megadott táblanévhez és egy nem üres oszlopnév-készlethez. Vegyük például a függvényt a Perl make_dup_count_query () függvényében, amely lekérdezést hoz létre a megadott oszlopokban található másolatok megkereséséhez és számozásához:

sub make_dup_count_query
az én ($ tbl_name, @col_name) = @_;
visszatérés (
"SELECT COUNT (*),". csatlakozz (",", @col_name)
. "\ nFROM $ tbl_name"
. "\ nGROUP BY". csatlakozz (",", @col_name)
. "\ nHAVING COUNT (*)> 1"
);
>

A make_dup_count_query () függvény a lekérdezést stringként adja vissza. Ha így hívod:

$ str = make_dup_count_query ("cat_mailing", "last_name", "first_name");
akkor a kapott $ str érték lesz:
SELECT COUNT (*), last_name, first_name
FROM cat_mailing
CSOPORT BY last_name, first_name
HOSSZABBÍTÁS (*)> 1

Most, hogy a lekérdezési string előtte van, futtathat egy lekérdezést a szkriptből, amely létrehozta a karakterláncot, átadta egy másik programnak, vagy írja le egy fájlt későbbi végrehajtásra. A receptek disztribúciójának dups könyvtára tartalmazza a dup_count.pl szkriptet, amelyet a függvény teszteléséhez használhat (ott más nyelvi beállításokat is találhat).

mysql> CREATE TABLE tmp
-> SELECT COUNT (*) számláló, last_name, first_name
-> FROM cat_mailing GROUP BY utolsó_név, first_name HAVA számlálás> 1;
mysql> SELECT cat_mailing. *
-> FROM tmp, cat_mailing
-> WHERE tmp.last_name = cat_mailing.last_name
-> ÉS tmp.first_name = cat_mailing.first_name
-> ORDER BY last_name, first_name;