Avatar billede ostehamster Nybegynder
18. august 2005 - 09:26 Der er 13 kommentarer og
1 løsning

Join, med kommaseperaret input

Hejsa

Hvis man nu har en tabel, dvd, over nogle DVD film, som indeholder:
titel, længde og genre

En anden tabel, genre, indeholder alle genrene, f.eks:

id | genre
  1    Komik
  2    Krimi

Hvis en film så er en krimi og en komedie, og man i tabellen dvd i rækken genre indsætter "1,2", fordi jo både er en krimi og en komedie, kan man så lave en join på dette?

Håber spørgsmål er forståeligt. Hvis man ikke kan lave en join direkte på ovenstående, er det så muligt at lave det på en anden måde, men med samme princip?

mvh
Christoffer
Avatar billede barklund Nybegynder
18. august 2005 - 09:31 #1
Nej, så laver du en tredje tabel til genretilhørsforhold:

genre_id | film_id
----------+---------
        1 |      1
        2 |      1

Så tilhører film 1 både genre 1 og 2. Dette kan du lave de ønskede joins på :)

--
Morten Barklund
Avatar billede ostehamster Nybegynder
18. august 2005 - 09:40 #2
Hmm, det bliver da vidst lidt voldsomt. Men, det er vel stadig bedre, end at lade client først finde alle film, og så spørge databasen om hver enkelt genre, eller?
Avatar billede barklund Nybegynder
18. august 2005 - 09:45 #3
Det bliver da ikke voldsomt - det er absolut måden at gøre det på :)
Avatar billede ostehamster Nybegynder
18. august 2005 - 09:49 #4
Hmm, jeg sad bare lige og tænkte på en opskrifts database, hvor der er årstid, højtid, kategori og tidspunkt. Dvs. en tabel til opskrifter, fire til kategorierne og fire til at sammenholde kategorier og opskrifter. Dvs. ni tabeller :)

Men takker for svaret... Ligger du et svar?
Avatar billede barklund Nybegynder
18. august 2005 - 09:53 #5
Helt i orden - men ja, databaser kan komme til at indeholde rigtig mange tabeller til meget simple, men med de rette indexes kan det sagtens gå lynhurtigt, hvis man får det tænkt korrekt :)
Avatar billede barklund Nybegynder
18. august 2005 - 09:53 #6
*Host*
Avatar billede ostehamster Nybegynder
18. august 2005 - 09:55 #7
Hmm, index. Det er hvilket kolonne den skal ondeksere sine data efter, eller?
Avatar billede barklund Nybegynder
18. august 2005 - 10:20 #8
Indexer kan laves på mange måder og bruges til at speede sine queries op. For eksempel ville man lave et foreign key index på begge attributter i denne dvd-genre-tilhørsforholds-tabel :)
Avatar billede ostehamster Nybegynder
18. august 2005 - 10:33 #9
Er lige lidt forvirret nu, hvis jeg har disse tre tabeller:

film -> id, titel, genre
genre -> id, genre
filmgenre -> filmid, genreid

Hvordan laver jeg så lige den join?
Avatar billede barklund Nybegynder
18. august 2005 - 10:44 #10
-- Find alle genrer for en film ud fra id
SELECT genre.genre FROM filmgenre INNER JOIN genre ON genre.id = filmgenre.genre_id WHERE filmgenre.film_id = ?

Eller noget i den stil :)

--
Morten Barklund
Avatar billede ostehamster Nybegynder
18. august 2005 - 10:51 #11
Så man kan ikke finde en film og alle de genre den høre til, i en sætning?
Avatar billede barklund Nybegynder
18. august 2005 - 10:54 #12
Hvordan havde du forestillet dig, at det skulle komme i en række? Altså, du henter en række med filmen og en række for hver genre. Du kan ikke kombinere rækker og søjler på den måde.

Men du kan godt hente det hele i en sætning - så får du bare en masse ekstra data, som for eksempel filmens beskrivelse flere gange.
Avatar billede ostehamster Nybegynder
18. august 2005 - 11:38 #13
Jeg håbede lidt på, at MySQL kunne sætte genrene på en kommasepareret liste :)

Hmm, er det så ikke lige så nemt bare at hente id'ene for genre ud, lav en ny forespørgelse på disse ide i genre rækken, og så har man dem. Så spare man også en tabel.
Avatar billede barklund Nybegynder
18. august 2005 - 11:56 #14
Hvad er der godt ved at spare en tabel? Og hvad er der godt ved at lave dårligt databasedesign? :/

Og hvis du har mysql 4.1, så er der faktisk kommet en group_concat, der kan lige hvad du søger :)
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