Zoeken naar evt dubbele namen in bestand

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

George van Baasbank

George van Baasbank

02/01/2013 16:51:22
Quote Anchor link
Hallo allemaal,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
 
PHP hulp

PHP hulp

22/12/2024 07:52:23
 
Eddy E

Eddy E

02/01/2013 17:00:20
Quote Anchor link
SQL heeft diverse functies om dubbele records te zoeken.
Ga eens kijken naar

GROUP BY ...
COUNT(...)
HAVING ...

Je zou iets kunnen maken als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT username, COUNT(emailadres) AS aantal
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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

02/01/2013 19:48:32
Quote Anchor link
Nee DISTINCT is geen garantie voor uniciteit, in de zin dat het één rij selecteert met dezelfde gegevens maar niet dat het bepaalt of de rij op zich uniek is.

En zoals (nog) altijd moeten we nog steeds geen data gaan vergelijken in PHP
 
Ivo Breeden

Ivo Breeden

02/01/2013 20:18:52
Quote Anchor link
George,
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

02/01/2013 21:20:06
Quote Anchor link
Sorry, maar ik vind dat nu juist de verkeerde benadering.
Je moet de invoer controleren niet de uitvoer.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.