Avatar billede mantson Nybegynder
29. august 2003 - 12:30 Der er 6 kommentarer og
1 løsning

mysql - måske join eller sum skal bruges?

Jeg er i fuld gang med et filmsite hvor man kan søge på filmtitler og personer blandt andet.

Mit problem er imidlertid det at når jeg brugeren henter et recordset frem med skuespillere, f.eks. ved at søge på en del af deres navn, så vil jeg gerne have at den udfra skuespilleren skriver at han er skuespiller, og det samme gælder manuskriptforfatter og instruktør. Men problemet opstår når det gælder personer der både er det ene og andet.

Tabellerne

tabelnavn: film_pers
kolonner:  pers_id
          fname
          lname

og en database der fortæller hvilke film de forskellige pers_id er med i, samt hvad de arbejder som i den film.

tabelnavn: film_join
kolonner:  pers_id  (dubletter for hver film de er med i)
          film_id  (svarer til en film i en tredje tabel)
          actor    (true or false)
          director (true or false)
          writer  (true or false)

den sidste tabel er ikke nødvendig i denne sammenhæng.

her er mit foreløbige bud, distinct fjerner en del af mit problem men ikke alle.

SELECT DISTINCT j.pers_id, p.fname, p.lname, j.actor, j.director, j.writer
FROM film_pers p, film_join j
WHERE p.lname LIKE 'MMColParam%' AND j.pers_id = p.pers_id
ORDER BY lname

'MMColParam%' er bare fordi det er en søgning på hvad efternavnene starter med.

Når jeg laver denne forespørgsel på efternavne der starter med "E" dukker dette op:

pers_id - fname - lname    - actor - director - writer

10667    Clint  Eastwood  true      true    false
10667    Clint  Eastwood  false    true    false
11221    Chris.  Eccleston  true      false    false

som i kan se er det ikke smart at der dukker to clint eastwood op, bare fordi han ikke laver nøjagtig det samme i de to film han er med i. jeg vil gerne have at den trækker dem sammen, så den ud for clint skriver alle de true ud for hans navn ved alle de erhverv(kolonner) han er med i (true). Håber i forstår og kan hjælpe, for det har drillet mig længe nu. Jeg kan sagtens selv klare den fra true og over til at skrive skuespiller og instruktør i stedet, men det andet kan jeg ikke. Måske skal der bruges inner join eller sum på en eller anden måde, men det kender jeg ikke så meget til.
Avatar billede detox Nybegynder
29. august 2003 - 13:29 #1
Måske kan du bruge:

SELECT DISTINCT j.pers_id, p.fname, p.lname, j.actor, j.director, j.writer
FROM film_pers p, film_join j
WHERE p.lname LIKE 'MMColParam%' AND j.pers_id = p.pers_id
GROUP BY p.pers_id
ORDER BY lname
Avatar billede mantson Nybegynder
29. august 2003 - 15:22 #2
tak for det hurtige svar, men jeg har prøvet det af, og hvis man bruger group by er man nød til at bruge Aggregate functions (som f.eks. SUM). Og jeg kan ikke benytte mig af Aggregate functions når jeg bruger where eller omvendt for den sags skyld.

desværre!
Avatar billede detox Nybegynder
29. august 2003 - 15:40 #3
Det er ikke rigtigt, du kan udemærket bruge 'GROUP BY' i dit tilfælde, men der var en lille fejl i eks. Se om det hjælper.

SELECT DISTINCT j.pers_id, p.fname, p.lname, j.actor, j.director, j.writer
FROM film_pers p, film_join j
WHERE p.lname LIKE 'MMColParam%' AND j.pers_id = p.pers_id
GROUP BY p.pers_id
ORDER BY p.lname
Avatar billede algizoft Nybegynder
29. august 2003 - 16:27 #4
Hvis du nu erstatter "true/false" med 1/0 således at true=1 og false=0 kan du lave flg:

SELECT DISTINCT j.pers_id, p.fname, p.lname, MAX(j.actor), MAX(j.director), MAX(j.writer)
FROM film_pers p, film_join j
WHERE p.lname LIKE 'MMColParam%' AND j.pers_id = p.pers_id
GROUP BY p.pers_id
ORDER BY p.lname

Det burde give flg. udskrift:
10667    Clint  Eastwood  1      1    0
11221    Chris.  Eccleston  1      0    0

Husk typen på actor, director og writere skal ændres til tinyint.
Avatar billede mantson Nybegynder
29. august 2003 - 20:25 #5
algizoft

kender ikke den datatype "tinyint" kan godt regne ud hvad den skal bruges til, men hvordan finder jeg den i ms access eller er det ikke muligt.
Avatar billede algizoft Nybegynder
30. august 2003 - 13:20 #6
Jeg troede det var mysql :-)
Men det kan også være int eller float - bare det er et tal og ikke en streng.
Avatar billede detox Nybegynder
30. august 2003 - 13:23 #7
Hehe, jeg troede osse vi befandt os i MySQL kategorien ;-)
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