2 Velden koppelen aan 1 veld (genres)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Leon Kunst

Leon Kunst

27/04/2009 21:51:00
Quote Anchor link
Heren,

ik zit met een left join probleempje denk ik...

Ik heb een hoofdtabel: films, deze bevat: genre1, genre2,

en ik heb een tabel: film_genres, met kolom: id, omschrijving

Nu wil ik genre1.id, en genre2.id koppelen, en daarvan de omschrijving ophalen.... vervolgens moet dit gekoppeld worden met CONCAT...

maar het lukt me niet eens om de omschrijvingen op te halen... genre1 was geen probleem, maar genre2 erbij ophalen wil niet zoals ik wil...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT films.titel, films.omschrijving, films.speelduur, films.gezien, films.in_bezit, films_genre.omschrijving
FROM films, films_genre
LEFT JOIN films_genre ON films.genre_id1 = films_genre1.id
LEFT JOIN films_genre ON films.genre_id2 = films_genre2.id



Dit is om 1 genre op te halen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT films.titel, films.omschrijving, films.speelduur, films.gezien, films.in_bezit, films_genre.omschrijving AS omschrijving1, films_genre.omschrijving AS omschrijving
FROM films
LEFT JOIN films_genre ON films.genre_id1 = films_genre.id


wie oh wie heeft de gouden tip :P
 
PHP hulp

PHP hulp

24/11/2024 09:15:00
 
Willem Jan Z

Willem Jan Z

27/04/2009 21:54:00
Quote Anchor link
De gouden tip is om eens opnieuw over je datamodel na te denken.
Soort van gouden regel: Als je meerdere kolomnamen met een nummer gaat aanmaken ben je fout bezig.

Aparte tabel met genres.
Koppeltabel films_genres
Genres apart ophalen.

edit: En toch help ik even, de tabel(len) van de LEFT JOIN moeten niet in de FROM.
Gewijzigd op 01/01/1970 01:00:00 door Willem Jan Z
 
Leon Kunst

Leon Kunst

27/04/2009 21:56:00
Quote Anchor link
Maar genres worden apart opgehaald toch? die staan apart in een tabel met een ID gekoppeld,

en dan heb ik nog de tabel met films, waarbij je 2 genres kunt kiezen. deze genres hebben een ID, en deze moeten dan weer gekoppeld worden aan de ID's uit de genres tabel....

niet zo verkeerd toch??
 
Willem Jan Z

Willem Jan Z

27/04/2009 22:09:00
Quote Anchor link
Je hebt in je films tabel 2 kolommen voor genres? Dat klopt niet.

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
films
-----
id INT PK
name VARCHAR
description TEXT

genres
-----
id INT PK
name VARCHAR

films_genres
------
film_id INT
genre_id INT

Afhangende van je reden van ophalen, kan je nu ervoor kiezen alle genres in 1 query op te halen in plaats van een extra query in je while loop. (In het geval van listing weergave). Aangezien een database veel sneller informatie verwerk dan PHP, kan je beter alle genres per film_id in een array stoppen, en daarna aan de hand van het film_id (via de whileloop) de betreffende genres uit de array vissen.

edit: Excuus, bedacht het me verkeerd. De query in de while loop is wel nodig...
Gewijzigd op 01/01/1970 01:00:00 door Willem Jan Z
 
Leon Kunst

Leon Kunst

27/04/2009 22:28:00
Quote Anchor link
maar waarom zou je niet 2 verschillende kolommen kunnen koppelen aan 1 tabel dan?

als je wat gaat hernoemen zou het dan niet werken?

want volgens mij krijg je nu een redelijk uitgebreide query?
en als ik films wil opslaan moe tik ook in 2 tabellen wat opslaan?

Aldus jou:

films
1 filmpje1 blablabla
2 filmpje2 blablabla

genres
123 actie
324 avontuur
435 oorlog


film_genres
1 123
1 324
2 435


nu heeft film 1 Actie en avontuur,
en film 2 oorlog

zie ik het zo goed?

*edit

dit werkt inderdaad nog net iets fijner, ik moet alleen wel m'n voorkant wat aanpassen, en queries aanpassen, maar ik kan nu eventueel net zoveel genres koppelen als ik wil...

Bedankt!
Gewijzigd op 01/01/1970 01:00:00 door Leon Kunst
 
Willem Jan Z

Willem Jan Z

28/04/2009 00:12:00
Quote Anchor link
Precies, zoals je zelf zegt. Een genre toevoegen is nu een eitje.
Dat het nu meer typwerk voor je site is maakt niet uit, want daarna levert het alleen maar op. Door de sleutels win je namelijk snelheid in je database.
 
Leon Kunst

Leon Kunst

28/04/2009 09:20:00
Quote Anchor link
Top!

Nu zit ik alleen nog even te stoeien met de query om de namen op te halen horend bij de gekoppelde genre_id's

Ik moet uiteindelijk 2 losstaande queries hebben

- Huidige genres_id's + naam van meegegeven ID van de film ophalen
(dus, ik vraag film 2 op, en dan wil ik de genre_id's + genre_namen hebben.
- Alle genre_id's en genre_namen ophalen...

Maar ik zit er al een tijd mee te stoeienn, en krijg het niet fatsoenlijk voor elkaar, doordat ik 3 tabellen moet koppelen...

Wie heeft er een idee???

thx alvast!
 
Leon Kunst

Leon Kunst

28/04/2009 15:39:00
Quote Anchor link
*bump (anders kan ik vanavond niet verder:$, niet te hard slaan sanThe)

Gelieve Niet Bumpen::
Bewust bumpen is eigenlijk pas echt fout. ;-)

Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de Afbeelding knop om je tekst aan te passen.

SanThe.
Gewijzigd op 01/01/1970 01:00:00 door Leon Kunst
 
Willem Jan Z

Willem Jan Z

29/04/2009 00:24:00
Quote Anchor link
Ik was denk ik niet meer helemaal wakker toen ik vorige keer die edit schreef. Het kan wel met 2 queries (zonder dus een query in de whileloop)

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
32
33
34
35
36
37
38
39
40
41
42
<?php
$films_sql
= "SELECT id, title, regiseur, release_date
                FROM films
                'ORDER BY title ASC;"
;
$genres_sql = "SELECT g.id AS id, g.name AS name, fg.film_id AS film_id
                FROM films_genres fg
                LEFT JOIN genres g ON g.id = fg.genre_id;"
;
                
if(($genres_result = mysql_query($genres_sql)) !== false) {
    if(mysql_num_rows($genres_result) > 0) {
        while($genre = mysql_fetch_assoc($genres_result)) {
            $genres[$genre['film_id']] = $genre;
        }
    }
else {
        $genres = array();
    }
}
else {
    echo mysql_error(); // Or log to file
}

if(($films_result = mysql_query($films_sql)) !== false) {
    echo '<table><tr><th>ID</th><th>Titel</th><th>Regiseur</th><th>Genres</th></tr>';
    if(mysql_num_rows($films_result) > 0) {
        while($film = mysql_fetch_assoc($films_result)) {
            if(!empty($genres[$film['id']])) { $genre_list = array();
                foreach($genres[$film['id']] as $genre)
                    $genre_list[] = '<a href="genre.php?id='.$genre['id'].'">'.$genre['name'].'</a>';
            }
else { $genre_list = array('Geen genres'); }
            echo '<tr>
                <td>'
.$film['id'].'</td>
                <td>'
.$file['title'].'</td>
                <td>'
.$film['regiseur'].'</td>
                <td>'
.join('<br />',$genre_list).'</td>
            </tr>'
;
        }
    }
else {
        echo '<tr><td colspan="4">Geen films</td></tr>';
    }
}
else {
    echo mysql_error(); // Or log to file
}
[
/code]
Gewijzigd op 01/01/1970 01:00:00 door Willem Jan Z
 
Leon Kunst

Leon Kunst

29/04/2009 10:59:00
Quote Anchor link
Lol, heb ik net m'n database structuur aangepast xD
Ik vond het al apart inderdaad...

Ik zit nu op m'n werk, heb hier helaas geen toegang tot m'n database, maar ik zal je script alvast implementeren. Bedankt voor alle moeite in ieder geval!

Ik laat nog even weten of het werkt of niet...

*edit:

Na wat aanpassen etc werkt het, zeer fijn overzichtje wordt het, thx!
Gewijzigd op 01/01/1970 01:00:00 door Leon Kunst
 



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.