Join met 4 tabellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Hugo

Hugo

06/02/2007 21:11:00
Quote Anchor link
Hoi,

Ik heb 4 tabellen die ik wil koppelen.

klanten
klant_id, voornaam, achternaam (+ alles naw gegevens, niet relevant)

films
film_id, titel, regie, cast

rooster
rooster_id, film_id, datum, tijd

reserveringen
reservering_id, rooster_id, klant_id, datum, aantal_kaarten

Ik zal het even kort toelichten. Het is een website voor een bioscoop (schoolopdracht). De klanten en films tabel spreken voorzich neem ik aan. Dan de rooster tabel. Hier staan de voorstellingen van de films. Een film draait op meerdere dagen en per dag meerdere keren.
Verder de reserverings tabel. Klanten kunnen kaarten reserveren voor een bepaalde film op een bepaald tijdstip. Vandaar dat er een koppeling word gemaakt met de rooster tabel dmv rooster_id en niet met de films tabel.

Nu mijn probleem. Ik wil per klant weten wat die klant heeft geserveerd. Dus ik heb die 4 tabellen nodig, maar ik weet niet hoe ik ze moet joinen. Heb al wat geprobeerd met een join en union.
En zo zou ik ook een lijst willen van de reserveringen waarbij je ziet welke klant wat welke film heeft gereserveerd op welke dag en tijdstip.

Kunnen jullie mij helpen?

ShuGos
 
PHP hulp

PHP hulp

20/11/2024 01:47:18
 
Stien ss

stien ss

06/02/2007 21:16:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php SELECT * FROM klanten
INNER JOIN reserveringen ON reserveringen.klant_id = klanten.klant_id
INNER JOIN rooster ON rooster.rooser_id = reserveringen.rooster_id
INNER JOIN films ON films.film_id = rooster.film_id
WHERE klanten.klant_id = 1 ?>


Zoiets?

Je moet nog wel even aanpassen welke kolommen je wilt hebben
Gewijzigd op 01/01/1970 01:00:00 door stien ss
 
Hugo

Hugo

06/02/2007 21:25:00
Quote Anchor link
Gaaf man! Het werkt. Super bedankt.
 
Hugo

Hugo

06/02/2007 21:32:00
Quote Anchor link
Ik heb wat aangepast ipv ON te gebruiken, heb ik USING gebruikt. Kijk zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT voornaam, titel, rooster.datum, rooster.tijd, reserveringen.datum AS datum_toevoeg
FROM klanten
INNER JOIN reserveringen USING (klant_id)
INNER JOIN rooster USING (rooster_id)
INNER JOIN films USING (film_id)
WHERE klanten.klant_id = 6;
 
Elwin - Fratsloos

Elwin - Fratsloos

06/02/2007 22:00:00
Quote Anchor link
Als ik het zo zie werkt USING alleen als de kolommen in beide tabellen dezelfde naam hebben.

Ik vind dat eigenlijk geen mooie oplossing (dezelfde namen). Kijk maar bijvoorbeeld als je de film in een categorie wilt plaatsen. Categorie heeft ook als kolom 'titel' evenals film. Dan zit je dus met dezelfde kolomnamen. Op zich niet erg, behalve als je de gegevens echt gaat gebruiken met bijvoorbeeld een echo (echo $row->titel, geeft dan altijd de laatste kolom met de naam titel).

Persoonlijk gebruik ik altijd een 3 letterige 'prefix' voor de kolommen in mijn tabellen. Bijvoorbeeld de tabel klant:
kln_id, kln_voornaam, etc.

Hierdoor heb ik nooit dezelfde kolomnamen in een query.

Maar goed, dan kan je dus ook niet USING gebruiken denk ik. Dan kom je dus uit bij de oplossing van Stien. Maar er is een mooiere. Even een fictieve query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT k.kln_voornaam, p.pls_naam,
FROM klant k, plaats p
WHERE k.kln_pls_id = p.pls_id
AND k.kln_id = 1

De inner join wordt nu afgehandeld in de WHERE, en in de FROM is direct duidelijk uit welke tabellen de data gehaald wordt.

Elwin

[Edit: Code-tags]
Gewijzigd op 01/01/1970 01:00:00 door Elwin - Fratsloos
 
Jan Koehoorn

Jan Koehoorn

06/02/2007 22:03:00
Quote Anchor link
Even een normalisatiekwestie: waarom heb je het velde datum nodig in de tabel reserveringen? Je hebt immers een rooster_id en in de tabel rooster staat ook al een datum.
 
Elwin - Fratsloos

Elwin - Fratsloos

06/02/2007 22:10:00
Quote Anchor link
@Jan
Scherp, scherp... :)

Maar het zou goed de datum (en tijd?) van het reserveren kunnen zijn. Niet van de voorstelling. Dus ik resereveer NOW() voor voorstelling X op datum Y.

Elwin
 
Jan Koehoorn

Jan Koehoorn

06/02/2007 22:20:00
Quote Anchor link
De datum van reserveren lijkt me niet relevant. Maar als dat inderdaad de bedoeling is zou ik beschrijvender veldnamen verzinnen.
 
Elwin - Fratsloos

Elwin - Fratsloos

06/02/2007 22:33:00
Quote Anchor link
Jan Koehoorn schreef op 06.02.2007 22:20:
De datum van reserveren lijkt me niet relevant.
Ach... dat weet je niet. Voor hetzelfde geld ga je het gebruiken voor statistieken (wanneer wordt er gereserveerd) of validatie (reservering moet binnen X-tijd gevalideerd zijn, anders vervalt deze).
Jan Koehoorn schreef op 06.02.2007 22:20:
Maar als dat inderdaad de bedoeling is zou ik beschrijvender veldnamen verzinnen.
Dat ben ik helemaal met je eens!

Elwin
 
Hugo

Hugo

06/02/2007 22:53:00
Quote Anchor link
Ik zal even wat uitleg geven bij de datum klom.

De datum en tijd kolom in de rooster tabel geeft aan wanneer een film draaid. Het zelfde idee als bij het reserveren op www.pathe.nl

De datum in de resservering tabel is het moment van reserveren. Ik weet dus wanneer een klant zich voor een bepaalde film heeft gereserveerd.
 
Jan Koehoorn

Jan Koehoorn

06/02/2007 23:00:00
Quote Anchor link
Ja, dus zou ik de veldnamen veranderen in respectievelijk draaidatum en reserveringsdatum. Dat voorkomt verwisselingen.
 



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.