Utiliser :
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
Vous devez utiliser des jointures OUTER pour que cela soit dans une seule requête ; Les jointures INNER pour toutes les tables exigeraient que l'utilisateur ait au moins un enregistrement dans la table FILES, PHOTOS et GROUPS pour figurer dans le jeu de résultats. Une jointure OUTER signifie que les utilisateurs avec des enregistrements dans au moins une des tables (FILES, PHOTOS ou GROUPS) seront renvoyés.
Mais les JOIN risquent également de gonfler l'ensemble de résultats, ce qui est le problème qui s'est produit dans la version précédente de ma réponse. En modifiant la requête pour utiliser des tables dérivées/vues en ligne pour les comptes FILES, GROUPS et PHOTOS, le problème est résolu et il n'y a pas besoin d'un GROUP BY en dehors des tables dérivées/vues en ligne.