M-am lovit de cateva ori de aceasta problema si de fiecare data cautam pe internet solutia si o foloseam ca atare. Dar dupa ce am Googleit a treia oara aceeasi chestie, m-am gandit ca ar fi timpul sa inteleg ce se afla in spatele acestui algoritm.
Vorbesc bineinteles despre acea mica interogare cu ajutorul careia identificam inregistrarile duplicat dintr-o baza de date.
Sa zicem ca avem o tabela in care tinem adrese de email si vrem sa vedem daca avem duplicate. Vom pleca de la premisa ca tabela respectiva are o structura de genul urmator:
CREATE TABLE user ( id INT NOT NULL PRIMAY KEY, username VARCHAR(64) NOT NULL, password VARCHAR(32) NOT NULL, first_name VARCHAR(64), last_name VARCHAR(64) );
In tabela de mai sus, campul username
este cel care tine adresa de email. In cazul in care va intrebati, campul password
are 32 de carctere pentru ca parola va fi criptata md5
.
Deci, cum facem sa vedem daca avem aceeasi adresa de email de mai multe ori in aceasta tabela? Interogarea va arata asa:
SELECT u.username, count(u.username) AS cnt FROM user u GROUP BY u.username HAVING cnt > 1 ;
Astfel, aflam care din adresele de email se gasesc de mai multe ori in baza de date. Odata ce avem aceasta informatie, putem sa facem o cautare dupa respectivele adrese de email si sa investigam duplicatele.
Dar putem face chiar mai mult. Poate vrem sa vedem, de exemplu cine s-a inscris de mai multe ori folosind acleasi nume si aceeasi adresa de email. Pentru acest lucru, vom modifica interogarea astfel:
SELECT u.first_name, u.last_name, u.username, count(u.username) AS cnt FROM user u GROUP BY u.username, u.first_name, u.last_name HAVING cnt > 1 ;
Acest tip de interogare poate fi foarte util in anumite situatii. De asemenea, se pot face niste statistici interesante. Putem afla de exemplu, cati utilizatori au ales aceeasi parola atunci cand s-au inscris. Nu vom vedea parola aleasa, pentru ca este criptata, dar cel putin stim cati utilizatori folosesc parole foarte comune…
SELECT u.password, count(u.password) AS cnt FROM user u GROUP BY u.password HAVING cnt > 1 ;
Cam asta este ideea de baza in aflarea duplicateolr din baza de date. Evident, in functie de situatie, putem sa rafinam cautarea si sa filtram cateva rezultate folosind si un WHERE
in interogarea noastra. Dar despre acest lucru vom vorbi poate, intr-un articol viitor.