Avatar billede sthen Nybegynder
01. april 2013 - 12:09 Der er 22 kommentarer og
1 løsning

sortering efter efternavn

Har en databasecelle i en MySQL som blot hedder navn, som består af både for-, mellem- og efternavn.

Nu vil jeg ved udtrækket gerne have sorteret efter efternavnetet.

How to do that??

Der kan jo sagtens både være to, tre, fire eller endnu flere fornavne, så jeg ved jo ikke hvornår efternavnet kommer, bortset fra at det altid kommer sidst.
Avatar billede michael_stim Ekspert
01. april 2013 - 12:14 #1
Lav din tabel om, så det bliver gjort på den rigtige måde. En kolonne for fornavn(e), evt. en for mellemnavn (hvis du ikke har dem sammen med fornavn) og en for efternavn.
Avatar billede michael_stim Ekspert
01. april 2013 - 12:15 #2
Og når/hvis du smider i databasen fra en webapp, så skal der selvfølgelig være 2 eller 3 felter med navne.
Avatar billede sthen Nybegynder
01. april 2013 - 12:16 #3
Kan jeg også godt, men det var ikke det jeg bad om løsningen på.
Avatar billede michael_stim Ekspert
01. april 2013 - 12:23 #4
Men det ER løsningen, det andet bliver noget rod og kræver unødig processorkraft på serveren.
Avatar billede sthen Nybegynder
01. april 2013 - 12:23 #5
Det var jo netop for at undgå alle disse fleter at jeg blot har lavet ét felt til navnet, da jeg både skal have hovedpersonens navn, men også mors, fars, og søskendes, så det bliver RIGTIG mange felter.

Jeg har engang set løsningen på mit problem her på eksperten, men kan ikke hitte det igen.
Avatar billede michael_stim Ekspert
01. april 2013 - 12:35 #6
Ikke testet:


$pattern = '/[^ ]*$/';
$str = 'Bruce Willis';
preg_match($pattern, $str, $results);


Men det er en total usikker metode. Hvad sker der hvis jeg skriver:

Skriv dit navn: Willis Bruce

I stedet for at have:

Skriv dit fornavn:
Skriv dit efternavn:

Du vil 100% få problemer. Og om du har ti eller tyve kolonner i en tabel, betyder ikke noget.
Avatar billede crusie Nybegynder
01. april 2013 - 12:35 #7
lad os antage at folk altid skriver deres efternavn til sidst - så kan du bruge denne løsning

http://dbaspot.com/sqlserver-programming/365656-find-last-word-string.html

DECLARE @comment VARCHAR(100)
SELECT @comment = REVERSE('Thisisatest')+' '
SELECT REVERSE(SUBSTRING(@comment, 1, CHARINDEX(' ',@comment) - 1))
Avatar billede crusie Nybegynder
01. april 2013 - 12:36 #8
lad os antage at folk altid skriver deres efternavn til sidst - så kan du bruge denne løsning

http://dbaspot.com/sqlserver-programming/365656-find-last-word-string.html

DECLARE @comment VARCHAR(100)
SELECT @comment = REVERSE('Thisisatest')+' '
SELECT REVERSE(SUBSTRING(@comment, 1, CHARINDEX(' ',@comment) - 1))
Avatar billede michael_stim Ekspert
01. april 2013 - 12:43 #9
#8
Det ligner mere en SQL server syntax, ved ikke lige om det går med MySQL.
Avatar billede crusie Nybegynder
01. april 2013 - 12:44 #10
var egentlig også mere den der REVERSE jeg tænkte på - den kan du bruge ved SQL queries.
01. april 2013 - 14:30 #11
sthen, hvem indfører navnene i tabellen?  Hvis du selv indfører dem og manuelt, så ville en simpel løsning være at indføre efternavnet først, såsom Hansen Jørgen.  Så kan du få efternavnene i rækkefølge ved at sortere på hele navnefeltet uden dikkedarer.

Men må jeg spørge hvad du skal bruge det til?  Hvis det 'bare' for eksempel er et medlemskartotek i en lokal børneforening med omkring 25 medlemmer og deres familier, så er det naturligvis ok ikke at give dig til at gå op i data normalisering og den slags.  Men så ville det vel kunne klares med et spreadsheet uden at skulle til at rode med en database.

Hvis det derimod er til et større system eller et system der kunne vokse, så kan database systemer såsom mysql en hel masse meget enkelt som du går glip af.  #5 kunne tyde på, at du anvender en enkelt tabel med en række for hver hovedperson og med felter for navne på far, mor, og hver søskende.  Hvis der nu er en familie med tre børn der alle er medlemmer af klubben, så kommer du til at skrive navnene på faderen og moderen og hver søskende tre gange hver.  Det er unødigt arbejde, og hvis du kommer til at skrive forkert en af gangene, eller en af børnene opgiver ukorrekt navn for eksempel 'Pedersen' i stedet for 'Petersen', så går der rod i tabellen og søgningerne.

En metode er at oprette en selvstændig tabel for navne med for hvert navn en id, for-,  mellem-, og efternavn.  I tabellen over hovedpersoner kommer der så et felt for navn id.  I endnu en særskilt tabel over relationer kommer der for hver hovedperson en række for hver relation. 

Her har jeg lavet en illustration over sådan en tabel struktur:  http://christianjorgensen.be/Billeder/Capture.PNG
Avatar billede arne_v Ekspert
01. april 2013 - 21:08 #12
Navn boer helt klart deles op i 2 eller 3 felter.

Og du kan have op til 4096 felter per tabel i MySQL, saa du behoever ikke bekymre dig om antal.
Avatar billede arne_v Ekspert
01. april 2013 - 21:09 #13
Lidt afhaengig af konteksten skal du muligvis ogsaa have erstattet de mange felter med flere raekker i en anden tabel som Christian er inde paa.
Avatar billede olebole Juniormester
01. april 2013 - 22:34 #14
<ole>

@crusie: Kan du bruge 'SELECT REVERSE' i MySQL?

/mvh
</bole>
Avatar billede arne_v Ekspert
01. april 2013 - 22:46 #15
Avatar billede olebole Juniormester
01. april 2013 - 22:54 #16
#15: absolut noget rod! Jeg havde bare ikke set den brugt i MySQL. Det eneste rigtige må være (mindst) en ekstra tabel
Avatar billede jantzen88 Nybegynder
02. april 2013 - 15:31 #17
Kan man ikke bruge noget i form af, hvis man antager at efternavn er uden mellemrum.
SELECT * FROM `navn` ORDER BY SUBSTRING_INDEX(`navn`, ' ', -1)
Avatar billede michael_stim Ekspert
02. april 2013 - 15:57 #18
Det er jo lige netop ordet "antager", der gør at program, apps, websites crasher, bliver ubrugelige osv osv ;o) Som min gamle kollega altid sagde: "Tro kan man gøre i kirken".
Avatar billede jantzen88 Nybegynder
02. april 2013 - 16:23 #19
#18 Lige præcis, os derfor han burde få ændret så der er flere felter i db
Avatar billede olebole Juniormester
02. april 2013 - 16:37 #20
Hvad siger sthen selv?
Avatar billede crusie Nybegynder
02. april 2013 - 22:16 #21
fuldstændig enig i at det er noget rod - men OP spurgte hvordan man gjorde det - ikke hvad der er den bedste løsning.

[trolling]
man har jo set lignende kode i Amanda, PolSag og EPJ - se bare hvor godt det kører *ahem*. Det kan jo være han laver user database til rejsekortet :P

[/trolling]
16. april 2013 - 08:40 #22
sthen, kom du fra det igen?  Du oprettede spørgsmålet og fik et antal indlæg, hvoraf du endnu ikke har reageret på de fleste.  Kom ind og fortæl hvad din videre hensigt er med tråden, og hvis spørgsmålet ikke længee er aktuelt så tag skridt til at lukke.
Avatar billede sthen Nybegynder
16. april 2013 - 09:14 #23
Undskyld mit længere fravær.

Har fundet frem til at fælgende løsning dækker det behov jeg har:

$value = "Peter Hans Jensen";
$words = explode (" " , $value);
echo $words[count ($words) - 1];
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

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