Użyj:
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
Musisz użyć złączeń OUTER, aby było to w jednym zapytaniu; Sprzężenia INNER dla wszystkich tabel wymagałyby, aby użytkownik miał co najmniej jeden rekord w tabeli PLIKI, ZDJĘCIA i GRUPY, aby znalazł się w zestawie wyników. Złączenie OUTER oznacza, że zostaną zwróceni użytkownicy z rekordami w co najmniej jednej z tabel (PLIKI, ZDJĘCIA lub GRUPY).
Ale JOIN ryzykuje również zawyżenie zestawu wyników, co było problemem, który pojawił się w poprzedniej wersji mojej odpowiedzi. Zmieniając zapytanie tak, aby używało tabel pochodnych/widoków wbudowanych dla liczby PLIKI, GRUPY i ZDJĘCIA, problem został rozwiązany i nie ma potrzeby GRUPOWANIA WEDŁUG poza tabelami pochodnymi/widokami wbudowanymi.