Zoeken naar evt dubbele namen in bestand
Ik heb mijzelf de volgende uitdaging opgelegd: Zoek in je database naar mogelijke dubbele registratie van personen. Met andere woorden: Welke personen komen mogelijk twee keer of vaker voor in mijn bestand.
Nu heb ik als start de volgende query bedacht:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
n.givn AS voornaam,
n.spfx AS tussenvoeg,
n.surn AS achternaam,
i.begi_datec AS geboortedatum,
i.begi_plac AS geboorteplaats,
i.end_datec AS overlijdensdatum,
i.end_plac AS overlijdensplaats,
i.sex AS geslacht,
n.iid AS relatie
FROM
ftphp__indi_name AS n
JOIN
ftphp__indi AS i
ON
i.iid = n.iid
ORDER BY
i.sex, soundex(n.surn), n.spfx, soundex(n.givn), i.begi_datec, i_end_datec
n.givn AS voornaam,
n.spfx AS tussenvoeg,
n.surn AS achternaam,
i.begi_datec AS geboortedatum,
i.begi_plac AS geboorteplaats,
i.end_datec AS overlijdensdatum,
i.end_plac AS overlijdensplaats,
i.sex AS geslacht,
n.iid AS relatie
FROM
ftphp__indi_name AS n
JOIN
ftphp__indi AS i
ON
i.iid = n.iid
ORDER BY
i.sex, soundex(n.surn), n.spfx, soundex(n.givn), i.begi_datec, i_end_datec
Met deze query krijg ik een lijst van namen gesorteerd op een aantal te testen items.
Nu wil ik eigenlijk deze query uitbreiden met een functionaliteit die mij alleen de mogelijke dubbele namen toont. Dit op basis van mijn sortering.
De namen die 100pct afwijken van de vorige regel (record) heoven dus niet getoond te worden.
Heeft iemand een suggestie?
George
Gewijzigd op 02/01/2013 17:02:05 door George van Baasbank
Ga eens kijken naar
GROUP BY ...
COUNT(...)
HAVING ...
Je zou iets kunnen maken als:
Code (php)
1
2
3
4
2
3
4
SELECT username, COUNT(emailadres) AS aantal
FROM tabel
GROUP BY emailadres
HAVING aantal > 1
FROM tabel
GROUP BY emailadres
HAVING aantal > 1
Dit geeft de gebruikersnaam en emailadressen die niet uniek zijn.
Met DISTINCT krijg je de unieke... je zou (php dan) een array_difference() kunnen gooien op 2 results: eentje met de unieke, eentje met alles.
Toevoeging op 02/01/2013 17:26:47:
En op StackOverflow vind je ook bijna alle vragen én antwoorden: http://stackoverflow.com/questions/854128/find-duplicate-records-in-mysql
Gewijzigd op 02/01/2013 17:01:30 door Eddy E
En zoals (nog) altijd moeten we nog steeds geen data gaan vergelijken in PHP
wat een interessante uitdagingen heb jij altijd.
Natuurlijk klopt het helemaal wat Eddy zegt. Zo kun je de doublures er haarfijn uithalen en ik denk dat je daarmee al een stuk geholpen bent. Maar het is wel de benadering van een programmeur. De werkelijkheid is vaak stroever dan de theorie. Ik ben in het verleden betrokken geweest bij een "ontdubbelingsproject". Het probleem is namelijk niet dat een persoon zomaar twee keer in de database terecht komt. Hij komt er twee keer in door schrijffouten. "Kees" en "Tom" zijn bijv. bij de Burgerlijke stand ingeschreven als "Cees" en "Thom". En het gaat hier om genealogie dus een geboortedatum op half-vergaan papier in een moeilijk leesbaar handschrift van "1 juni 1768" kan ook wel eens "1 juli 1768" zijn. Zie ik dat goed, George?
Ik proef in je probleemstelling dat je eigenlijk liefst een glijdende schaal van vergelijking wilt zien. Een rapportcijfer: 10 is identiek, 9 is een lettertje verschil en 0 betekent het lijkt er in de verste verte niet op. Begrijp ik dat goed George?
Maar daar zijn computers slecht voor uitgerust. Twee dingen zijn gelijk of ze zijn het niet. Een tussenweg is voor de digitale computer moeilijk. Het meest toepasselijke tool lijkt me de levenshtein() functie. Levenshtein() geeft het aantal lettertekens verschil tussen twee strings. Een levenshtein() van 0 betekent dus dat twee strings identiek zijn. Hoe groter de levenshtein(), hoe groter het verschil. Ik denk dat je daar voortreffelijke lijsten met op elkaar lijkende personen mee kunt maken.
Ongelukkigerwijs kent MySQL geen levenshtein(). PHP wel. Ik zou een php programma maken om de tabel twee keer door te spitten. Maar daar moet je wel wat tijd instoppen.
Sorry dat ik geen pasklaar antwoord voor je heb, George, maar ik hoop dat je er toch wat hebt aan iemand die meedenkt.
Je moet de invoer controleren niet de uitvoer.