Avatar billede mik789 Nybegynder
10. december 2003 - 17:50 Der er 18 kommentarer og
1 løsning

indviklet sortering

Her er en krøllet opgave:

Jeg skal lave en bibliografi (en fortegnelse over bøger). Hver titel indeholder oplysninger om forfatternavn, titel, år osv. Og alle titlerne skal generelt ordnes alfabetisk efter forfatterefternavn. Så langt, nemt nok. Men det forekommer at samme forfatter har flere titler på listen. De skal så yderligere sorteres efter år, med de tidligste først og de seneste derefter. Endvidere kan en forfatter godt have udgivet flere titler samme år, men markerer dette ved bogstaver efter årstal, altså f.eks.: 2003a, 2003b osv.

Men der er yderligere en krølle. En forfatter kan foruden de bøger han selv har udgivet have udgivet nogle sammen med andre medforfattere. Disse skal placeres i listen umiddelbart efter de bøger han er alene om, og hvis der er flere af den slags skal de ordnes efter efternavnet på den anden forfatter og evt. yderligere efter år hvis der er flere af de samme to forfattere.

Et eks.:

Hansen, M., 2001. Ølbrygningens glæder.
Hansen, M., 2002a. Mit liv.
Hansen, M., 2002b. Skæge forviklinger.
Hansen, M. & Jakobsen, O., 1999. De sværeste valg.
Hansen, M. & Jakoby, F., 1995. Seljsport.
Hansen, M. & Nielsen, P., 1997. Min mening.
Ivanof, K., 1958. Ruslands historie.

Det simpleste er jo selvfølgelig at nummerere alle titler. Men så har man ikke fordelen ved den automatiske sortering. F.eks. hvis man senere vil tilføje en titel. Så skal den jo det rigtige sted ind i rækkefølgen. Og dvs. man skal ændre ved numrene for alle de andre. Derfor ville en sortering efter kriterierne ovenfor være bedre i det lange løb.

Er der nogle der kunne tænke sig lidt hjernepusleri her op til jul, så er her en opgave.

//mik
Avatar billede arne_v Ekspert
10. december 2003 - 17:56 #1
Vil en simpel:
  ORDER BY forfatter,år
ikke løse problemet ?
Avatar billede arne_v Ekspert
10. december 2003 - 17:57 #2
'Hansen, M.' < 'Hansen, M. & Jakobsen, O.' < 'Hansen, M. & Jakoby, F.'

og

'2001' < '2002a' < '2002b'
Avatar billede mik789 Nybegynder
10. december 2003 - 18:09 #3
vil ORDER BY forfatter,år også klare det med at hvis der er to forfattere skal der yderligere ordnes efter den anden forfatters efternavn? Hvert forfatternavn er jo sat ind i et felt for sig.

Jeg forstår ikke helt din anden kommentar. Hvordan sættes dette ind i en forspørgsel?
Avatar billede erikjacobsen Ekspert
10. december 2003 - 18:12 #4
Hvordan er det præcis du håndterer at en bog har flere forfattere?
Avatar billede arne_v Ekspert
10. december 2003 - 18:13 #5
"Hansen, M. & Jakobsen, O." antydede jo at alle forfatternavnene var i et felt.

Hvis det ikke er tilfældet men at der er separate forfatter og bog tabeller
og en forfatterbog tabel for at mappe M:M relationen, så *er* det vanskeligt
at få det output du vil have.

Min anden kommentar var bare argument for at soretingen ville være rigtig.
Avatar billede mik789 Nybegynder
10. december 2003 - 18:14 #6
jeg sætter hvert forfatternavn ind i et celle for sig. Derfor kan jeg ikke sortere som arne_v foreslår. Jeg har nogle felter der hedder forfatter_1, forfatter_2, forfatter_3 osv. i alt fire + et der bare skriver "og flere", hvis der er flere
Avatar billede mik789 Nybegynder
10. december 2003 - 18:15 #7
Jo men det jeg har skrevet er det endelige output når felterne yderligere har været igennem en php kommando. I tabellen står hver forfatter i sin egen celle.
Avatar billede arne_v Ekspert
10. december 2003 - 18:17 #8
ORDER BY forfatter_1, forfatter_2, forfatter_3, forfatter_4, år
Avatar billede arne_v Ekspert
10. december 2003 - 18:17 #9
Iøvrigt er det et nok et uheldigt design med 4 forfatter felter.
Avatar billede mik789 Nybegynder
10. december 2003 - 18:17 #10
Problemet med at skrive flere forfattere i samme felt er at det er forskelligt hvilke tegn der skal skrives imellem dem alt efter hvor mange der er:

Hansen, M.
Hansen, M. & Petersen, S.
Hansen, M., Petersen, S. & Jørgensen, A.
osv
Avatar billede arne_v Ekspert
10. december 2003 - 18:20 #11
Er det et problem ?
Avatar billede mik789 Nybegynder
10. december 2003 - 18:21 #12
arne_v>hvordan opfattes tegnet "&" i en sortering? kommaet ignoreres vel bare...
Avatar billede mik789 Nybegynder
10. december 2003 - 18:22 #13
nå, men jeg er desværre nødt til at afbryde....
vender tilbage senere i aften
tak så langt....
Avatar billede arne_v Ekspert
10. december 2003 - 18:25 #14
OK - jeg forstår pointen.

Men der er nu mange workarounds. F.eks. at bruge komma konsekvent i databasen og
så erstatte det sidste komma med og i applikationen.
Avatar billede erikjacobsen Ekspert
10. december 2003 - 18:27 #15
Hvis du ikke vil lave om på strukturen (hvilket dog nok kan anbefales) skal
du ikke vist ikke gøre dig forhåbning om at gøre dit i en SQL-sætning.
Du kan sikkert gøre det i det bagvedliggende programmeringssprog.
Avatar billede Slettet bruger
10. december 2003 - 21:04 #16
Hvis jeg skulle lave det, ville jeg nok smide det i 3 tabeller.

Forfattere:
------------
forfatterid
navn
andre felter med forfatteroplysninger

Bøger:
-------
bogid
titel
årstal
ISBN
andre felter med bogoplysninger

forfatterbog
-------------
forfatterid
bogid


Der kommer så en række pr. forfatter for hver bog i den sidste tabel.

Eventuelt ville jeg lave et forfatterid-felt i bogtabellen også, for at kunne specificere den primære forfatter.
Avatar billede mik789 Nybegynder
11. december 2003 - 07:58 #17
arne_v> jeg tror jeg går efter din løsning. det er jo enkelt nok.

sandbox> hvad er fordelen ved at gøre det sådan, frem for at have det hele i én tabel? hvordan sorteres dette?
Avatar billede mik789 Nybegynder
12. december 2003 - 15:28 #18
arne_v>jeg klarede det med dit forslag og flg. funktion:

function commaToAmp($string) {
$pattern = "/(\.{1}), ([a-zA-Z&;\-\']+), ([a-zA-Z&;\.\-]+)$/";
$replacement = "\$1 & \$2, \$3";
$ampAdded = preg_replace($pattern, $replacement, $string);
return $ampAdded;
}

men læg lige et svar for dit forslag...
Avatar billede arne_v Ekspert
12. december 2003 - 15:43 #19
svar
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