Avatar billede hojgaard Nybegynder
26. august 2002 - 11:56 Der er 10 kommentarer og
1 løsning

Opdele tekst i MySQL

Hej,

Jeg har en MySQL database, hvor jeg skal kunne lave fonetisk søgning på fx efternavn. Det har jeg også fået lavet så den kan:

SELECT * FROM person WHERE STRCMP(SOUNDEX(efternavn), SOUNDEX("Petersen")) = 0;

Mit problem er hvis personen hedder "Erik Petersen", og brugeren søger på "Petersen". Så kommer "Erik Petersen" ikke længere med som resultat, da "Erik Petersen" har en anden værdi end "Petersen" har.

Nogle ideer til hvordan det kan løses?
Avatar billede Slettet bruger
26. august 2002 - 12:02 #1
Kan du ikke bare kaste en LIKE ind??

SELECT * FROM person WHERE STRCMP(SOUNDEX(efternavn), SOUNDEX("Petersen")) = 0 OR efternavn LIKE '%petersen%';
Avatar billede hojgaard Nybegynder
26. august 2002 - 12:29 #2
Ja så får man godt nok "Erik Petersen" med som resultat.

Problemet er bare at søgningen skal fungere fonetisk... for hvad hvis brugeren kommer til at skrive "Pedersen". Her skulle "Erik Petersen" også gerne komme med som resultat.
Avatar billede proaccess Nybegynder
26. august 2002 - 13:03 #3
Du kan prøve med:
  SELECT * FROM person WHERE SOUNDEX(efternavn) LIKE CONCAT('%',SOUNDEX("Petersen"),'%');
Avatar billede hojgaard Nybegynder
26. august 2002 - 13:43 #4
Hej proaccess,

"Erik Petersen" kom desværre ikke med som resultat...
Avatar billede proaccess Nybegynder
26. august 2002 - 14:15 #5
Vi er vel enige om at du ikke har HELE navnet registreret i "efternavn"...

Så burde SOUNDEX'erne bare kunne sammenlignes...
SELECT * FROM person WHERE SOUNDEX(efternavn)=SOUNDEX("Petersen");

Fornavnet har ingen betydning hér...

BTW: Mit tidligere forslag var WAY OFF, i det at SOUNDEX returnerer en værdi, som ikke kan sammenlignes med andet end en anden SOUNDEX-værdi... SORRY!
Avatar billede hojgaard Nybegynder
26. august 2002 - 14:54 #6
Det er rigtigt at det ikke er hele navnet, der er registreret i "efternavn". Problemer er at en person fx godt kan hedde "Hans Erik Petersen" eller måske "Hans Peter Erik Petersen"...
I min database har jeg kun mulighed for at gemme "fornavn" og "efternavn".
Alligevel skal brugerne kunne nøjes med at søge på "Petersen" og alligevel få "Erik Petersen" med som resultat.

Så "SELECT * FROM person WHERE SOUNDEX(efternavn)=SOUNDEX("Petersen");" virker desværre heller ikke...
Avatar billede proaccess Nybegynder
26. august 2002 - 15:02 #7
Hvis du nu nøjedes med at lagre EFTERNAVNET i det dertil indrettede felt, så kunne resten være i fornavn's-feltet... Og så ville det køre... (altså søgning på EFTERNAVN)

Hvis du nu prøver at udtale "Erik Petersen" efter fulgt af "Petersen", så lyder det jo heller ikke helt ens... vel  ;0)
Avatar billede hojgaard Nybegynder
26. august 2002 - 15:15 #8
Hvis det bare ville være så let at alle personer havde et fornavn og efternavn, ville der heller ikke være et problem. Desværre kan personer have en navn delt op i 3, 4 og endda mere.

Der må da være andre som har haft samme problem?
Avatar billede proaccess Nybegynder
27. august 2002 - 08:00 #9
Uden at kende din tabel-struktur nærmere, må jeg gå ud fra at du har et entydigt id-felt.

Det er så til at lave "din egen" index-tabel... Indeholdende id-nummeret fra personer, og SOUNDEX()-værdien på hver eneste del af det fulde navn.

Personer:
ID Navn
1 Erik Petersen
2 Hans Peter Erik Petersen
3 Peter Nielsen

myIndex:
ID Sound
1 E620
1 P3625
2 E620
2 P3625
2 H520
2 P360
3 P360
3 N425

Derved kan du finde de OD'er, som svarer til "Petersen" ved:

  SELECT ID FROM myIndex WHERE Sound=SOUNDEX("Petersen");

Ulempen ved denne løsning er at DU SELV skal sørge for at få opdateret myIndex-tabellen ved ændring af personer...
Avatar billede hojgaard Nybegynder
27. august 2002 - 11:01 #10
Hej proaccess

Jeg havde tænkt på den løsning du kommer med, men jeg havde håbet det kunne løses uden...

Tak for hjælpen!
Avatar billede proaccess Nybegynder
27. august 2002 - 11:05 #11
Tak for pts.

Sommetider er det desværre ikke til at komme over, hvor gærdet er lavest... God arbejdslyst.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester