Brug:
SELECT u.userid,
u.username,
COALESCE(f.numFiles, 0) AS numFiles,
COALESCE(p.numPhotos, 0) AS numFiles,
COALESCE(g.numGroups, 0) AS numGroups
FROM [USER] u
LEFT JOIN (SELECT t.userid,
COUNT(*) AS numFiles
FROM [FILES] t
GROUP BY t.userid)f ON f.userid = u.userid
LEFT JOIN (SELECT t.userid,
COUNT(*) AS numPhotos
FROM [PHOTOS] t
GROUP BY t.userid) p ON p.userid = u.userid
LEFT JOIN (SELECT t.userid,
COUNT(*) AS numGroups
FROM [GROUPS] t
GROUP BY t.userid) g ON g.userid = u.userid
WHERE u.userid = 2
Du skal bruge OUTER joins for at dette skal være i én forespørgsel; INNER joins for alle tabellerne vil kræve, at brugeren har mindst én post i FILES, PHOTOS og GROUPS-tabellen for at være i resultatsættet. En OUTER join betyder, at brugere med poster i mindst én af tabellerne (FILER, FOTO eller GRUPPER) vil blive returneret.
Men JOINs risikerer også at puste resultatet op, hvilket er det problem, der opstod i den tidligere version af mit svar. Ved at ændre forespørgslen til at bruge afledte tabeller/indlejrede visninger til FILES, GROUPS og FOTO-tællingerne, er problemet løst, og der er ikke behov for en GROUP BY uden for de afledte tabeller/inlinevisninger.