Gebruik:
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
U moet OUTER-joins gebruiken om dit in één query te doen; INNER-joins voor alle tabellen vereisen dat de gebruiker ten minste één record in de tabel FILES, PHOTOS en GROUPS in de resultatenset heeft. Een OUTER-join betekent dat gebruikers met records in ten minste één van de tabellen (FILES, PHOTOS of GROEPEN) worden geretourneerd.
Maar JOIN's lopen ook het risico de resultatenset op te blazen, wat het probleem is dat zich voordeed in de vorige versie van mijn antwoord. Door de query te wijzigen om afgeleide tabellen/inline views te gebruiken voor de FILES, GROEPEN en PHOTOS tellingen, is het probleem opgelost en is er geen GROUP BY nodig buiten de afgeleide tabellen/inline views.