Avatar billede hermandsen Juniormester
26. februar 2004 - 23:38 Der er 13 kommentarer og
1 løsning

Sortering ud fra komma-separeret id-liste, med og uden dubletter

Hej Eksperter!

Jeg har 4 tabeller i en database. Den underste tabel (show_redskab) indeholder (id, navn).

Den næste (show_program) indeholder (id, navn, redskaber) hvor (redskaber) er en komma-separeret liste af show_redskab-id'er.

I næste to tabeller refererer så videre fra de forgående med id-lister osv. Det er sådan lidt rodet! :)

Når jeg nu henter (redskaber) fra show_program (den komma-separerede liste), hvordan får jeg så lettest, og hurtigst, en liste tilbage fra MySQL der indeholder de redskaber der skal bruges til det enkelte program? Hvad med dubletter? Nogle gange skal de med, andre gange skal de ikke!

Jeg har løst det med PHP, men for det første bliver det uoverskueligt, og for det andet må det kunne gøres smartere/hurtigere med de rette SQL-sætninger.

Findes der evt. en bedre måde så brugen med de komma-separerede id-lister kunne lægges på hylden?

//hermandsen
Avatar billede erikjacobsen Ekspert
26. februar 2004 - 23:49 #1
Ja, lav en tabel mere "mellem" show_program og show_redskab.
Hvis program nummer 7 bruger redskaber nummer 9 og 13, så putter du

  7  |  9
  7  |  13

i denne mellemliggende tabel. Lidt joins, og så har du svaret.

Felter med kommaseparerede værdier giver tit sådant bøvl som du har her.
Avatar billede hermandsen Juniormester
26. februar 2004 - 23:56 #2
Okay...
Det første lyder ret fornuftigt... Der skal vel også være et id-felt for at MySQL kan finde ud af det!

Så noget i retning af (id, program_id, redskab_id)?

Lige omkring joins er jeg ikke den store haj!! Så der må jeg lige læse lidt mere på lektien! Har også hørt at joins skulle være frygteligt langsomme, men det er måske en skrøne?
Avatar billede erikjacobsen Ekspert
26. februar 2004 - 23:59 #3
Jah, det er en skrøne. Man skal dog sørge for at joine på felter med indexer,
hvis der er mange poster. Alle verdens edb-baserede systemer ville bryde
sammen, og du ville ikke engang kunne købe en pakke gær i supermarkedet hvis
joins var frygteligt langsomme.

Du kan sætte et id felt på, eller alternativt gøre de 2 felter,  som jeg anførte
til en fælles primær nøgle.
Avatar billede hermandsen Juniormester
27. februar 2004 - 00:15 #4
Så fungerede Eksperten igen!! :)

Njaaa...
Problemet er bare at nogle programmer f.eks. skal bruge det samme redskab to gange, og så bliver der to ens felter, hvilket der, så vidt jeg husker, ikke må være i en database! Eller var de databaser jeg lærte om den gang bare for gamle!? :)

En anden situation er at jeg af og til skal hive mange programmer ud efter hinanden, og så må der f.eks. ikke være dubletter i blandt. Er det lettest at kode sig ud af PHP med den, eller findes der også noget smart til det?
Avatar billede erikjacobsen Ekspert
27. februar 2004 - 00:18 #5
Du kan sætte et antal på

  7 | 9 | 1
  7 | 13 | 2

hvor 1 og 2 repræsenterer antallet. Nogle gange skal man ikke gøre livet mere
besværligt for sig selv end højst nødvendigt.
Avatar billede hermandsen Juniormester
27. februar 2004 - 00:25 #6
Njaaa... Eller nok nærmere rækkefølge, for der skal af og til angives en bestemt rækkefølge. Så slipper vi i hvert fald for id'et!! :)

Det er ikke fordi der stilles ekstremt store krav til den enkelte tabel, men de andre tabeller er jo i præncippet bygget på samme måde, så jeg referer bare til denne for ikke at gøre det alt for kompliceret! ;)

Okay, men hvis vi lige tager en tabel mere med:
show_sekvens (en tredje tabel) indeholdt tidligere en komma-separeret liste af show_program-id'er. Hvis jeg nu skal hente alle redskaber ud af en show_sekvens, hvordan gør jeg så det?? Flere database kald efter hinanden, eller kan jeg dobbelt joine?
Avatar billede erikjacobsen Ekspert
27. februar 2004 - 00:28 #7
Hvis du skal have rækkefølge på, skal den defineres

  7 | 13 | 1
  7 | 9 | 2
  7 | 13 | 3

hvor 1, 2, og 3 definerer rækkefølgen. Den tredie tabel med noget kommasepareret
skal vel så også laves om? Og ja, du kan joine vilkårligt mange tabeller sammen.
Avatar billede hermandsen Juniormester
27. februar 2004 - 00:37 #8
Ja, den tredje tabel skal selvfølgelig også laves om... Efter at have set dit system, må det helt klart siges at skulle laves om!! :)

Jeg skal lige være helt på den sikre side omkring joins, men er ved at læse på lektien, så burde det sidde på lystavlen en gang i nat!! :)

Inden du lige lægger et svar og får dine point, så kan du også lige få den sidste tabel.

show_show (den sidste tabel) indeholdt tidligere en liste af show_program og show_sekvens id'er. Den tabel der skal holde de to sammen, skal vel så bare have en ekstra række i forhold til de andre, som kan fortælle om det er et program eller en sekvens, men hvad når man joiner??

Er du med endnu!? :)
Avatar billede hermandsen Juniormester
03. marts 2004 - 19:17 #9
>>erikjacobsen
Du må godt lægge et svar! ;)
Avatar billede hermandsen Juniormester
12. marts 2004 - 22:18 #10
Skal endnu en gang bede om et svar... Jeg har 80 point med dit navn på!! :)
Avatar billede erikjacobsen Ekspert
13. marts 2004 - 07:39 #11
Ja, undskyld jeg ikke har sagt det før - der er sommetider for mange emails i postkassen ;)

Men jeg samler slet ikke på point, tak.
Avatar billede hermandsen Juniormester
13. marts 2004 - 12:46 #12
Hmmm...
Jeg synes nu stadig at når man har ydet andre en service, så er det også fair nok at give lidt for det...

Jeg giver en omgang ved næste EkspertenFest, eller Hardware kast eller hvad det nu bliver til!! ;)

Tak for hjælpen!

//hermandsen
Avatar billede erikjacobsen Ekspert
13. marts 2004 - 13:00 #13
Jeg har skam heller ikke noget imod at du vil "give lidt for det". Jeg samler
ikke på point, fordi de intet er værd, og kun egner sig til at skabe larm og ballade.
Avatar billede hermandsen Juniormester
13. marts 2004 - 13:21 #14
Det er helt okay!! Vi har alle sammen en holdning, og hverken din eller min er for den sags skyld forkert!! :)

Det skal lige siges at jeg ikke er typen der lægger op til ballade!! ;)

Endnu en gang tak for hjælpen!! :)
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