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
Debe usar combinaciones EXTERNAS para que esto esté en una consulta; Las uniones INNER para todas las tablas requerirían que el usuario tenga al menos un registro en la tabla ARCHIVOS, FOTOS y GRUPOS para estar en el conjunto de resultados. Una unión EXTERNA significa que se devolverán los usuarios con registros en al menos una de las tablas (ARCHIVOS, FOTOS o GRUPOS).
Pero JOIN también corre el riesgo de inflar el conjunto de resultados, que es el problema que ocurrió en la versión anterior de mi respuesta. Al cambiar la consulta para usar tablas derivadas/vistas en línea para el conteo de ARCHIVOS, GRUPOS y FOTOS, el problema se resuelve y no hay necesidad de un GRUPO POR fuera de las tablas derivadas/vistas en línea.