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.
Ik heb wat aangepast ipv ON te gebruiken, heb ik USING gebruikt. Kijk zo:
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;
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:
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.
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.
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.
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.