MySQL Query
Dat is allemaal heel simpel, maar een film kan meerdere genres hebben.
Ik gebruik 1 row voor de genre genaamd genre in de tabel film.
Nu kan er in die row bijv. 1-5 staan, dus Genre ID nummer 1 en ID nummer 5.
Maar nu kan ik niet met een query simpelweg controleren of een film in die genre zit.
Dit kan NIET
SELECT * FROM film WHERE genre='".$gen['id']."'
Ofzoiets.
Nu heb ik een functie gemaakt
Code (php)
Die opzich goed werkt, hij geeft het ID nummer terug als die film in die genre zit alleen nu het probleem!!
Hoe maak ik die werkent via een Query?
Want
Code (php)
1
2
3
2
3
<?php
mysql_result(mysql_query("SELECT count(id) FROM films WHERE genre='".genre($gen['id'],genre)."'"),0);
?>
mysql_result(mysql_query("SELECT count(id) FROM films WHERE genre='".genre($gen['id'],genre)."'"),0);
?>
Werkt natuurlijk niet.
De functie genre heeft 2 waardes nodig.
1: ID nummer van de genre,
2: Alle genres van die film.
Maar hoe maak ik dit werkent?
Sommige zullen het wel niet snappen 8)
m.v.g
Dennis Mertens
Waarom doe je het zo moeilijk? Het is veel gemakkelijker om van filmnaam en genre een sleutel te maken. (die combinatie moet uniek zijn) en dan krijg je dus wel een nieuwe regel in je filmtabel, voor elk 2e genre van de film. Maar zo kan je wel op film selecteren. Als je dan ook nog van je filmid de auto increment weghaald en een nieuw veld, genaamd rec_id toevoegd (betekend record id) en die auto_inc maakt, hou je toch de werking met je filmid, en dan kan je veel gemakkelijker selecteren.
Zeker als je straks duizenden films in zo'n database hebt zal deze manier van werken nogal veel servercapaciteit kosten.
En mijn manier vind ik opzich heel simpel.
Gewijzigd op 18/01/2006 17:57:00 door Dennis Mertens
Het werkt niet eens :|, dus het kost ook niks.
Dennis:
Maak een tabel 'filmgenres' aan met als velden (bijvoorbeeld) film-id en genre-id. Stel dat film ABC de genres 1, 3 en 6 heeft, dan krijg je 3 records in de tabel filmgenres:Aha en met 3 genres?
En mijn manier vind ik opzich heel simpel.
En mijn manier vind ik opzich heel simpel.
film-id genre-id
ABC 1
ABC 3
ABC 6
Met een SELECT genre-id from filmgenres WHERE film-id = 'ABC' kun je dan opvragen in welke genres een film zit.
Met SELECT film-id from filmgenres WHERE genre-id = 1 vraag je op welke films allemaal van genre 1 zijn.
Jouw oplossing is inderdaad simpeler, maar het is veel ingewikkelder om iets met die data te doen. Als je bijvoorbeeld alle actiefilms wilt hebben moet je elk record inlezen en de string met genres verwerken. Door de koppeling tussen film en genre in een aparte tabel te zetten, heb je veel meer mogelijkheden.
Het berekenen van het aantal films in een genre (waar je oorspronkelijke vraag over ging) kan dan heel eenvoudig met:
SELECT genre-id, COUNT(*)
FROM filmgenres
GROUP BY genre-id
Dennis:
En je zegt dat mijn manier veel servercapiciteit kost.
Het werkt niet eens :|, dus het kost ook niks.
Het werkt niet eens :|, dus het kost ook niks.
Als je straks 1000 films hebt, moet je elke film uitlezen, en kijken of het genre (of de genres) overeenkomen met waarop wordt gezocht. Je gaat PER film kijken of die overeenkomt, zo ja weergeven, zo nee, volgende film. Dit kost onnodig veel rekenkracht. Zeker wanneer je een grote database krijgt werkt jou methode nogal vertragend.
Met de methode die Willem aangaf (komt deels overeen met mijn idee, hij heeft er alleen een extra tabel bij gemaakt) SELECTEERD die alleen de films uit het genre, en hoeft er niet zoveel gerekend te worden. Daardoor is die manier veel sneller en kost die minder servercapasiteit.
Snappie?
Ik zou overigens niet eens een nette manier weten om het zonder extra tabel te doen. Als je die extra records aanmaakt in je film-tabel (zoals je in een eerder bericht voorstelde) dan moet je alle overige informatie dubbel gaan opslaan. dat is zonde van je disk-capaciteit (en uiteindelijk ook van je snelheid).
Inderdaad is mijn oplossing geen nette, en helemaal niet volgens de normalisatieregels. Maar daar was het me ook niet om te doen.
Tjah.. Je kan zo eigenlijk ook wel al zien dat er niet genormaliseerd is, dan zou het er wel anders uit zien.
Mijn ervaring is dat een koppeltabel in elke veel-op-veel relatie de beste oplossing is.
Ik bedacht me net trouwens nog iets. als je die genres nou zo opslaat -1-5-8- enzovoort dat betekend dat ieder genrenummer tussen 2 - staat. Als je dan je query zo doet:
$sql="SELECT * FROM film WHERE genre LIKE '%-".$gen['id']."-%'";
Kan het wel werken. Maar zoals al eerder aangegeven, moet er dan veel meer gezocht en gerekend worden en kost dat capaciteit.
EDIT: % tekens aan LIKE toegevoegd
Gewijzigd op 19/01/2006 12:28:00 door Robert Deiman