MySQL Query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dennis Mertens

Dennis Mertens

18/01/2006 17:50:00
Quote Anchor link
Ik ben bezig met een Film lijst. Hierbij kun je via de admin films toevoegen. Elke film heeft een genre en ik wil dus dat je ook een film bij een genre kan neer zetten.
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    function genre($a,$b)
    {

        /* $a = ID nummer van de genre */
        /* $b = ID nummers van de genres van de film */

        $genres = @explode("-",$b);
        for($i = 0; $i <= count($genres)-1; $i++)
        {

            if($genres[$i] == $a)
                return $genres[$i];
        }
    }

?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
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
 
PHP hulp

PHP hulp

27/10/2020 10:10:29
 
Robert Deiman

Robert Deiman

18/01/2006 17:55:00
Quote Anchor link
@ Dennis

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.
 
Dennis Mertens

Dennis Mertens

18/01/2006 17:56:00
Quote Anchor link
Aha en met 3 genres?
En mijn manier vind ik opzich heel simpel.
Gewijzigd op 18/01/2006 17:57:00 door Dennis Mertens
 
Dennis Mertens

Dennis Mertens

18/01/2006 18:40:00
Quote Anchor link
En je zegt dat mijn manier veel servercapiciteit kost.
Het werkt niet eens :|, dus het kost ook niks.
 
Willem vp

Willem vp

19/01/2006 09:58:00
Quote Anchor link
Dennis:
Aha en met 3 genres?
En mijn manier vind ik opzich heel simpel.
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:

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
 
Robert Deiman

Robert Deiman

19/01/2006 10:03:00
Quote Anchor link
Dennis:
En je zegt dat mijn manier veel servercapiciteit kost.
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?
 
Willem vp

Willem vp

19/01/2006 12:16:00
Quote Anchor link
@Robert:
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).
 
Robert Deiman

Robert Deiman

19/01/2006 12:20:00
Quote Anchor link
Klopt, het voorbeeld van mij was niet de netste, maar het ging mij er eigenlijk ook om, dat de genres niet bij elkaar in 1 kolom moesten staan (1-3-5 ofzo) Maar apart, omdat dat veel aan snelheid scheelt.
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.
 
Jan Koehoorn

Jan Koehoorn

19/01/2006 12:23:00
Quote Anchor link
Mijn ervaring is dat een koppeltabel in elke veel-op-veel relatie de beste oplossing is.
 
Robert Deiman

Robert Deiman

19/01/2006 12:27:00
Quote Anchor link
Klopt, ben ik met je eens.. het was ook geen net voorbeeld.
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
 



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.