Usar:
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
Você precisa usar junções OUTER para que isso esteja em uma consulta; Junções INNER para todas as tabelas exigiriam que o usuário tivesse pelo menos um registro na tabela FILES, PHOTOS e GROUPS para estar no conjunto de resultados. Uma junção OUTER significa que os usuários com registros em pelo menos uma das tabelas (FILES, PHOTOS ou GROUPS) serão retornados.
Mas os JOINs também correm o risco de inflar o conjunto de resultados, que é o problema que ocorreu na versão anterior da minha resposta. Ao alterar a consulta para usar tabelas derivadas/visualizações embutidas para as contagens de ARQUIVOS, GRUPOS e FOTOS, o problema é resolvido e não há necessidade de um GROUP BY fora das tabelas derivadas/visualizações embutidas.