Foutieve informatie uit database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Maarten Matthe

Maarten Matthe

20/05/2013 16:22:28
Quote Anchor link
Ik heb hier een paar jaar geleden dezelfde vraag gesteld. Toen ben ik er ook niet uit geraakt, maar zit nu terug met zelfde probleem.

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:
Afbeelding

Met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'


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
 
PHP hulp

PHP hulp

09/05/2024 02:32:32
 
Willem vp

Willem vp

20/05/2013 16:46:39
Quote Anchor link
Ik neem aan (mag hopen) dat GENRE_ID numeriek is. Je moet in je query de waardes dan niet tussen '' zetten...
 
Maarten Matthe

Maarten Matthe

20/05/2013 17:03:28
Quote Anchor link
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.
 
Erwin H

Erwin H

20/05/2013 17:09:11
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/05/2013 17:13:47
Quote Anchor link
Dat klopt in mysql mag een int tussen ''.
Maar omdat in je koppeltabel elke rij maar één genre_id heeft kan je query nooit resultaat opleveren.
Probeer dit eens:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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.
 
Willem vp

Willem vp

20/05/2013 17:31:16
Quote Anchor link
Maarten Matthe op 20/05/2013 17:03:28:
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.
 
Maarten Matthe

Maarten Matthe

20/05/2013 17:42:43
Quote Anchor link
Iedereen alvast bedankt.

Erwin H op 20/05/2013 17:09:11:
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)
PHP script in nieuw venster Selecteer het PHP script
1
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;



Werkt ;) dan kan ik verder ;)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.