Eigen movie/film database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Maarten M

Maarten M

05/08/2012 13:57:24
Quote Anchor link
Hey,

ik heb hier thuis een reeks dvd's op mijn pc gebackupt.

Nu wil ik een database (php/sql) maken.
Dit is aardig gelukt en ben relatief te vreden (Ik kan films zoeken enz...)

Maar zit nu met 1 probleem. Een film zoeken op titel (in een tabel) is geen enkel probleem... Maar nu wil ik op genre kunnen zoeken, en liefst soms nog op 2 genres.

Mijn database ziet er als volgt uit:
3 tabellen: Films, genre, film_genre

Afbeelding

Hoe moet ik nu bijvoorbeeld alle films selecteren die zowel tot het genre: Horror als tot het genre Actie behoren ZONDER dat ik sommige resultaten 2 keer krijg?
Ik weet niet meer juist wat ik destijds geprobeerd heb, maar toen kreeg ik alle "horror" films EN alle "actie" films...

Alvast bedankt
 
PHP hulp

PHP hulp

14/11/2024 18:36:08
 
Albert de Wit

Albert de Wit

05/08/2012 14:17:58
Quote Anchor link
WHERE Genre_ID='1' OR Genre_ID='2'?

zoiets?
Gewijzigd op 05/08/2012 14:19:52 door Albert de Wit
 
Eddy E

Eddy E

05/08/2012 14:22:29
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT f.film_titel
FROM film AS f
LEFT JOIN film_genre AS fg
ON (fg.film_id = f.id)
LEFT JOIN genre AS g
ON (g.id = fg.genre_id)
WHERE g.genre LIKE '%oorlog'
OR g.genre LIKE '%actie%'
GROUP BY g.genre_id
ORDER BY f.film_titel DESC


Probeer eens...
Gewijzigd op 05/08/2012 14:27:19 door Eddy E
 
Erwin H

Erwin H

05/08/2012 14:30:10
Quote Anchor link
Hoewel de vraag in eerste instantie heel anders was, gaat het om een identiek probleem:
http://www.phphulp.nl/php/forum/topic/ongelooflijk-trage-queries-met-zf/85836/2/

De laatste post van Ger zou een werkende oplossing moeten geven (getest door hem en mij) en ook nog eens een efficiente.
 
Maarten M

Maarten M

05/08/2012 14:33:33
Quote Anchor link
Eddy Erkelens op 05/08/2012 14:22:29:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT f.film_titel
FROM film AS f
LEFT JOIN film_genre AS fg
ON (fg.film_id = f.id)
LEFT JOIN genre AS g
ON (g.id = fg.genre_id)
WHERE g.genre LIKE '%oorlog'
OR g.genre LIKE '%actie%'
GROUP BY g.genre_id
ORDER BY f.film_titel DESC


Probeer eens...


Zal ik is proberen...

Erwin H op 05/08/2012 14:30:10:
Hoewel de vraag in eerste instantie heel anders was, gaat het om een identiek probleem:
http://www.phphulp.nl/php/forum/topic/ongelooflijk-trage-queries-met-zf/85836/2/

De laatste post van Ger zou een werkende oplossing moeten geven (getest door hem en mij) en ook nog eens een efficiente.


Als het eerder geschreven gedeelte niet lukt, zal ik dit is bekijken.

Alvast bedankt.
Btw, maakt niet uit dat ik een secondje langer moet wachten. Het is een volledig offline database die wss enkel ik of de mensen hier lokaal, gebruik van zullen maken. Als het maar werkt :D
 
Erwin H

Erwin H

05/08/2012 14:38:02
Quote Anchor link
Ik denk dat die van Eddy wel werkt, maar het is in principe een foute query. GROUP BY kan je eigenlijk niet gebruiken als je geen aggregate functie gebruikt. Ik weet dat veel mensen daar een broertje aan dood hebben, maar het werkt dus alleen bij de gratie van de database server....
 
Maarten M

Maarten M

05/08/2012 14:48:42
Quote Anchor link
Krijg
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT f.film_titel
FROM film AS f
LEFT JOIN film_genre AS fg
ON (fg.film_id = f.id)
LEFT JOIN genre AS g
ON (g.id = fg.genre_id)
WHERE g.genre LIKE '%oorlog'
OR g.genre LIKE '%actie%'
GROUP BY g.genre_id
ORDER BY f.film_titel DESC

niet echt aan de praat... 1 genre lukte wel, maar vanaf ik een 2de toevoegde, gaf hij 0 resultaten terug...
 
Jurgen B

Jurgen B

05/08/2012 14:57:50
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT F.titel, COUNT(*) AS cnt
FROM film_genre FG
    INNER JOIN film F
        ON F.id = FG.film_id
    INNER JOIN (    SELECT id
            FROM genre G
            WHERE G.genre = 'horror' OR G.genre = 'actie') SG
        ON FG.genre_id = SG.id
GROUP BY FG.film_id
HAVING cnt =   (SELECT COUNT(*) test
        FROM genre G
        WHERE G.genre = 'horror' OR G.genre = 'actie')

Dit werkt op basis van count. Ik heb alleen het idee dat dit ook foute resultaten kan opleveren maar zo even geen situatie bedenken om te testen.
 
Thomas Helling

Thomas Helling

05/08/2012 15:45:49
Quote Anchor link
misschien ben ik wel gek hoor, en klopt het geheel niet wat ik zeg.
Maar kan je niet gewoon gebruik maken van UNIQ?
 
Erwin H

Erwin H

05/08/2012 15:50:04
Quote Anchor link
Uhm, conclusie laat ik aan jou.... maar UNIQUE (niet UNIQ) heeft hier totaal niets, maar dan ook niets mee te maken. Dat gebruik je bij het creeeren van een index.
 
Eddy E

Eddy E

05/08/2012 16:00:42
Quote Anchor link
Daarom gebruik ik ook DISTINCT.
Dat is dat je geen dubbele records wilt zien.
Mocht je niet van die GROUP BY houden, verwijder dan eens gewoon. Zelf een beetje spelen zou geen kwaad kunnen hoor.



Wat jij nu wilt is hetzelfde als ik op mijn website heb:
www.zunflappie.nl/foto/

Kijk even rond en selecteer iets. Als je bijvoorbeeld 'wielen' selecteert moet je alleen wiel-gerelateerde foto's krijgen. Als je 517 (= met spaakwielen) selecteerd, krijg je alleen die.
Als je de 530 selecteer krijg je gegoten wielen.

Nu kan het best zijn dat een aantal foto's verkeerd getagd zijn hoor.
Maar onderstaande code gebruik ik als opbouw van de query:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php


    // SQL BOUWEN (eerst WHERE-ding))
foreach($_SESSION['tags'] as $key => $val)
    {

    if(substr($key, 0, 6) == 'tagid_')
        {

        $where_array[] = 'tagid = '.intval(substr($key, 6));
        }
    }

if(empty($where_array)){$where_array[] = 'tagid = 2';}
$aantal_where = count($where_array);
if($aantal_where == 1)
    {

    $where = $where_array[0];
    }

else
    {
    $where = implode(" OR ", $where_array);
    }



// sql uitvoeren en fetchen etc
$sql = "SELECT foto, tagid, COUNT(foto) AS aantal
FROM zun_foto
WHERE "
.$where."
GROUP BY foto
HAVING aantal = "
.$aantal_where."
ORDER BY foto ASC"
;
?>
Gewijzigd op 05/08/2012 16:04:00 door Eddy E
 
Erwin H

Erwin H

05/08/2012 16:12:48
Quote Anchor link
@Eddy,

Wat jij hier post kan nooit kloppen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT f.film_titel
FROM film AS f
LEFT JOIN film_genre AS fg
ON (fg.film_id = f.id)
LEFT JOIN genre AS g
ON (g.id = fg.genre_id)
WHERE g.genre LIKE '%oorlog'
OR g.genre LIKE '%actie%'
GROUP BY g.genre_id
ORDER BY f.film_titel DESC

Je joined genre twee keer. Een keer als g en een keer als fg. vervolgens selecteer je de records die g.genre 'oorlog' hebben of die g.genre 'actie' hebben. Hiermee selecteer je DUS NIET de films die BEIDE hebben. Als je dat wilt doen moet je g.genre gelijk zetten aan 'oorlog' en (AND dus) fg.genre gelijk aan 'actie'.

Quote:
Hoe moet ik nu bijvoorbeeld alle films selecteren die zowel tot het genre: Horror als tot het genre Actie behoren ZONDER dat ik sommige resultaten 2 keer krijg?

(bold is mijn toevoeging)
Gewijzigd op 05/08/2012 16:13:33 door Erwin H
 



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.