Použijte:
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
Aby to bylo v jednom dotazu, musíte použít OUTER spojení; VNITŘNÍ spojení pro všechny tabulky by vyžadovalo, aby uživatel měl alespoň jeden záznam v tabulce FILES, PHOTOS a GROUPS, aby byl v sadě výsledků. VNĚJŠÍ spojení znamená, že budou vráceni uživatelé se záznamy alespoň v jedné z tabulek (FILES, PHOTOS nebo GROUPS).
JOINy však také riskují nafouknutí sady výsledků, což je problém, který se vyskytl v předchozí verzi mé odpovědi. Změnou dotazu na použití odvozených tabulek/vložených pohledů pro počty FILES, GROUPS a PHOTOS je problém vyřešen a není potřeba GROUP BY mimo odvozené tabulky/inline pohledy.