Archief - SQL: joins

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

maT'

Legacy Member
Ik zit serieus in de knoop mijn mijn joins in sql (inner, left, right, ... ):
ik heb nu een situatie waarin ik met een stuk of 5 queries informatie uit mijn DB haal, maar ik weet dat het via JOINS met 1 of 2 queries kan lukken, dus dat wil ik dan ook bereiken.

Huidige DB structuur

Nu los ik dit zo op:
PHP:
        $BestandID = $_GET['bID'];
        $QuerySelecteerBestand = "SELECT Naam, Locatie, AuteurID, Datum, CatID, BestandID FROM bestanden WHERE b.BestandID = '$BestandID'";
        $ResultaatQueryBestand = mysql_query($QuerySelecteerBestand) Or Die (mysql_error());
        $Bestand = mysql_fetch_object($ResultaatQueryBestand);

        //aantal downloads tellen
        $QueryAantalDownloads = "SELECT GebruikerID FROM aantaldownloads WHERE DownloadID = '$BestandID'";
        $ResultaatAantalDownloads = mysql_query($QueryAantalDownloads) Or Die (mysql_error());
        $AantalDownloads = mysql_num_rows($ResultaatAantalDownloads);

        // categorie bepalen  (enkel indien bezoeker geen eigenaar is)
        $CatID = $Bestand->CatID;
        $QuerySelecteerCategorie = "SELECT CatNaam FROM categorie WHERE CatID = '$CatID'";
        $ResultaatQueryCategorie = mysql_query($QuerySelecteerCategorie) Or Die (mysql_error());
        $Cat = mysql_fetch_object($ResultaatQueryCategorie);

        // auteur bepalen
        $AuteurID = $Bestand->AuteurID;
        $QuerySelecteerAuteur = "SELECT LidID, LidNaam, KlasID FROM leden WHERE LidID = '$AuteurID'";
        $ResultaatQueryAuteur = mysql_query($QuerySelecteerAuteur) Or Die (mysql_error());
        $Auteur = mysql_fetch_object($ResultaatQueryAuteur);

        //klas bepalen
        $AuteurKlasID = $Auteur->KlasID;
        $QuerySelecteerKlas = "SELECT KlasNaam FROM klassen WHERE KlasID = '$AuteurKlasID'";
        $ResultaatSelecteerKlas = mysql_query($QuerySelecteerKlas) Or Die (mysql_error());
        $Klas = mysql_fetch_object($ResultaatSelecteerKlas);
Vanaf het moment dat ik probeer om er via een INNER join bv de tabel categorie bij probeer te betrekken, geeft de query niets meer terug. 'k heb al forums & docs liggen afzoeken, maar ik faal er elke keer in :sad:
hoe krijg'k hier alle (of bijna alle) informatie van die 5 queries in 1 query ?

Dece

Legacy Member
SELECT bestanden.BestandID, bestanden.KlasID, categorie.catID, categorie.Catnaam, klassen.KlasNaam, leden.LidNaam, COUNT(aantaldownloads.IPadres) AS downloads
FROM bestanden, aantaldownloads INNER JOIN bestanden ON categorie.catid= bestanden.catid
INNER JOIN klassen ON bestanden.KlasID = klassen.KlasID
LEFT JOIN leden ON bestanden.auteurID = leden.lidid
WHERE bestanden.BestandID = '$BestandID'

should do denk ik

maT'

Legacy Member
Whaaa, this works :woohoo:
Heb er nu het volgende van gemaakt (based on your example):

SELECT b.BestandID, b.KlasID, b.Locatie, b.Datum, b.Naam, c.CatID, c.CatNaam, k.KlasNaam, l.LidNaam, COUNT(a.IPadres) AS downloads
FROM bestanden AS b, aantaldownloads AS a, categorie AS c INNER JOIN bestanden ON c.CatId= b.CatId
INNER JOIN klassen AS k ON b.KlasID = k.KlasID
LEFT JOIN leden AS l ON b.AuteurID = l.LidID
WHERE b.BestandID = '$BestandID'
GROUP BY b.BestandID


Blijkbaar moet er ook een Group By bijstaan, anders doet hij toch moeilijk.
thx Dece :applause:

*edit; er mankeert nog 1 ding, namelijk het bepalen van de categorie.
Toen'k de eerste keer die SQL uitvoerde, gaf hij de foutmelding dat categorie niet bestond, dus heb'k die er bij de FROM-clause bijgestoken. Maar nu bepaald hij de categorie niet. (blijft dus blanco). 'k heb al geprobeerd een LEFT JOIN erbij te plaatsen, om de tbl categorie erbij te voegen, maar dat lukt dus niet echt.

killgore

Legacy Member
maT' zei:
*edit; er mankeert nog 1 ding, namelijk het bepalen van de categorie.
Toen'k de eerste keer die SQL uitvoerde, gaf hij de foutmelding dat categorie niet bestond, dus heb'k die er bij de FROM-clause bijgestoken. Maar nu bepaald hij de categorie niet. (blijft dus blanco). 'k heb al geprobeerd een LEFT JOIN erbij te plaatsen, om de tbl categorie erbij te voegen, maar dat lukt dus niet echt.
je moet ergens met een where bepalen welke categorie je moet hebben he :)

Lashknife

Legacy Member
verdemme, kga voor die join toestanden toch nog eens mijne cursus moeten bovenhalen (of een of andere site bezoeken natuurlijk, veel sneller), want buiten impliciete inner join gebruik ik da eigenlijk ni...

maT'

Legacy Member
killgore zei:
je moet ergens met een where bepalen welke categorie je moet hebben he :)
dit
Code:
 WHERE b.BestandID = '$BestandID' AND c.CatID = b.CatID
werkt al niet, 'k heb hier nog eens elke mogelijke left, right of inner join geprobeerd, maar die CatNaam wilt hij maar niet echt weergeven.

Heb zelfs met HAVING & GROUP BY liggen experimenteren, maar da geeft dus alleen maar errors ;)
'k heb dit vroeger geleerd, waar LEFT, RIGHT & INNER joins nu weer voor stonden, en toch lukt het maar niet.

killgore

Legacy Member
der klopt iets nie in uw query ze, je haalt eens iets gewoon uit bestanden en dan left joinde ook nog eens uw table bestanden :crazy:


SELECT b.BestandID, b.KlasID, b.Locatie, b.Datum, b.Naam, c.CatID, c.CatNaam, k.KlasNaam, l.LidNaam, COUNT(a.IPadres) AS downloads
FROM bestanden AS b, aantaldownloads AS a
INNER JOIN categorie c ON c.CatId= b.CatId
INNER JOIN klassen AS k ON b.KlasID = k.KlasID
LEFT JOIN leden AS l ON b.AuteurID = l.LidID
WHERE b.BestandID = '$BestandID'
GROUP BY b.BestandID
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan