Foutieve informatie uit database
Ik ben bezig met een super eenvoudig database je te maken voor al mijn films/muziek e.d.
In mijn index.php staat een soort van filter functie - of hoe je dat ook moet noemen - waarmee je kunt filteren op genres.
Nu is het zo dat enkele van mijn films/cd's tot meerdere genres behoord, en met het filteren wil ik enkel de films die tot al die genres behoren, te weten komen.
Hieronder de databases:
Met
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT films.FILM_TITEL
FROM films, combi
WHERE
combi.GENRE_ID='1'
AND combi.GENRE_ID='2'
AND combi.GENRE_ID='3'
FROM films, combi
WHERE
combi.GENRE_ID='1'
AND combi.GENRE_ID='2'
AND combi.GENRE_ID='3'
kreeg ik geen resultaten... Waarom snap ik niet.
De combi.GENRE_ID is al ingevuld omdat ik dit eerder in het script bekomen had.
Kan iemand mij zeggen hoe ik uit die tabel wel de films kan halen die tot de 3 genres behoren? Heb al vanalles met distinct, group by, having, count e.d. zitten proberen zonder enig succes.
Alvast bedankt
Ik neem aan (mag hopen) dat GENRE_ID numeriek is. Je moet in je query de waardes dan niet tussen '' zetten...
Willem vp op 20/05/2013 16:46:39:
Ik neem aan (mag hopen) dat GENRE_ID numeriek is. Je moet in je query de waardes dan niet tussen '' zetten...
GENRE_ID, en al mijn andere ID's zijn INT. Het moet niet maar ik denk dat het op zich geen kwaad kan.
Maarten Matthe op 20/05/2013 16:22:28:
kreeg ik geen resultaten... Waarom snap ik niet.
dat is heel simpel. Voor elke combinate film - genre krijg je een aparte rij terug uit je database. Dus als een film 3 genres heeft dan krijg je drie rijen terug, een rij voor elk genre. Er is dus geen enkele rij met alle drie de genres en dus kan je ook nooit met de door jouw gebouwde query resultaten krijgen.
Hoe het wel kan:
Maar omdat in je koppeltabel elke rij maar één genre_id heeft kan je query nooit resultaat opleveren.
Probeer dit eens:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT films.film_titel, COUNT(combi.genre_id) AS genres
FROM films
JOIN combi
ON combi.film_id = films.film_id
GROUP BY films.film_titel
HAVING genres = 4
FROM films
JOIN combi
ON combi.film_id = films.film_id
GROUP BY films.film_titel
HAVING genres = 4
Toevoeging op 20/05/2013 17:19:50:
Niet helemaal de vraag goed gelezen, ik dacht alle genres. Zie Erwins reactie voor de juiste oplossing.
Maarten Matthe op 20/05/2013 17:03:28:
GENRE_ID, en al mijn andere ID's zijn INT. Het moet niet maar ik denk dat het op zich geen kwaad kan.
Willem vp op 20/05/2013 16:46:39:
Ik neem aan (mag hopen) dat GENRE_ID numeriek is. Je moet in je query de waardes dan niet tussen '' zetten...
GENRE_ID, en al mijn andere ID's zijn INT. Het moet niet maar ik denk dat het op zich geen kwaad kan.
Het kan wel degelijk kwaad. Integervelden moet je vergelijken met integers en stringvelden moet je vergelijken met strings. Doe je dat niet, dan moet MySQL een impliciete typecast uitvoeren, en dat zorgt ervoor dat hij eventuele indices op je tabel niet gebruikt.
Als MySQL geen index gebruikt, betekent dat, dat hij de volledige tabel moet scannen bij het uitvoeren van je query. Bij kleine tabellen maakt dat niet zoveel uit, maar bij grote tabellen en joins maakt dat je query ontzettend traag.
Erwin H op 20/05/2013 17:09:11:
dat is heel simpel. Voor elke combinate film - genre krijg je een aparte rij terug uit je database. Dus als een film 3 genres heeft dan krijg je drie rijen terug, een rij voor elk genre. Er is dus geen enkele rij met alle drie de genres en dus kan je ook nooit met de door jouw gebouwde query resultaten krijgen.
Hoe het wel kan:
Maarten Matthe op 20/05/2013 16:22:28:
kreeg ik geen resultaten... Waarom snap ik niet.
dat is heel simpel. Voor elke combinate film - genre krijg je een aparte rij terug uit je database. Dus als een film 3 genres heeft dan krijg je drie rijen terug, een rij voor elk genre. Er is dus geen enkele rij met alle drie de genres en dus kan je ook nooit met de door jouw gebouwde query resultaten krijgen.
Hoe het wel kan:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT films.FILM_TITEL
FROM films
LEFT JOIN combi ON films.film_id = combi.film_id
WHERE combi.GENRE_ID = 1
OR combi.GENRE_ID = 2
OR combi.GENRE_ID = 3
GROUP BY films.FILM_TITEL
HAVING count(*) = 3;
FROM films
LEFT JOIN combi ON films.film_id = combi.film_id
WHERE combi.GENRE_ID = 1
OR combi.GENRE_ID = 2
OR combi.GENRE_ID = 3
GROUP BY films.FILM_TITEL
HAVING count(*) = 3;
Werkt ;) dan kan ik verder ;)