Archief - JOIN resultaat niet compleet

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.

Sick-Boy

Legacy Member
Voor de website van mijn zaalvoetbalploeg wou ik graag wat statistieken genereren. Hiervoor wil ik drie tabellen combineren via JOINs. De drie tabellen zijn de volgende:

MembersTabel: MemberID, MemberNaam, ...
MemberTypeTabel: MemberID, TypeID.
WedstrijdSpelerTabel: SpelerID, WedstrijdID.

Elke member kan verschillende functies of types hebben (Spelers, voorzitter, secretaris, ...). Elke rij in SpelerWedstrijdTabel is een unieke combinatie van speler en wedstrijd.

De statistiek die ik wil genereren is het aantal wedstrijden die een speler van de C-ploeg (TypeID = 7) gespeeld heeft. Dus gebruik ik de volgende query:

PHP:
SELECT M.MemberVoornaam, COUNT(WST.SpelerID) AS Gespeeld
FROM MembersTabel AS M 
INNER JOIN MembersTypeTabel AS MT ON (M.MemberID = MT.MemberID) 
LEFT JOIN WedstrijdSpelerTabel AS WST ON (M.MemberID = WST.SpelerID)
WHERE MT.TypeID = 7 GROUP BY WST.SpelerID

Maar ik krijg een onverwacht resultaat. Er zijn 12 spelers in de C-ploeg en 2 daarvan hebben 0 wedstrijden gespeeld (geen enkele vermelding in WedstrijdSpelerTabel). Voor de bovenstaande query krijg ik 11 rijen terug, met voor 1 speler een waarde 0 bij gespeeld. Ik veronderstel dat die Group By statement de oorzaak is van die ene speler en geen tweede. Maar toch had ik verwacht dat beide spelers in de lijst zouden staan, omwille van de LEFT JOIN.

Iemand die mij de juiste query kan vertellen?

On a sidenote: ik krijg hetzelfde resultaat met een subquery.

PHP:
SELECT M.MemberVoornaam, COUNT(WST.SpelerID) 
FROM MembersTabel AS M 
INNER JOIN (
SELECT MemberID 
FROM MembersTypeTabel 
WHERE TypeID = 7 
) S ON (M.MemberID = S.MemberID) 
LEFT JOIN WedstrijdSpelerTabel AS WST 
ON (M.MemberID = WST.SpelerID) 
GROUP BY WST.SpelerID

Sick-Boy

Legacy Member
Dat klopt voor het GROUP BY gedeelte, niet het COUNT gedeelte.
Bedankt!

kimdenkt

Legacy Member
Dat was inderdaad dom van me, COUNT moet natuurlijk op de tussentabel :)
De reden waarom je maar een van de 2 kreeg is dat ze allebei dezelfde dummy waarde kregen in de outer join, wat je nu dus vermijdt door te GROUPen op de echte spelerid.
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