29. august 2003 - 12:30Der 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.
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
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.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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
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.
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
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.
Hehe, jeg troede osse vi befandt os i MySQL kategorien ;-)
Synes godt om
Ny brugerNybegynder
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.