Verwendung:
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
Sie müssen OUTER-Joins verwenden, damit dies in einer Abfrage enthalten ist. INNER Joins für alle Tabellen würden erfordern, dass der Benutzer mindestens einen Datensatz in den Tabellen FILES, PHOTOS und GROUPS hat, um in der Ergebnismenge enthalten zu sein. Ein OUTER Join bedeutet, dass Benutzer mit Datensätzen in mindestens einer der Tabellen (FILES, PHOTOS oder GROUPS) zurückgegeben werden.
JOINs riskieren jedoch auch, die Ergebnismenge aufzublähen, was das Problem ist, das in der vorherigen Version meiner Antwort aufgetreten ist. Indem Sie die Abfrage ändern, um abgeleitete Tabellen/Inline-Ansichten für die FILES-, GROUPS- und PHOTOS-Zählungen zu verwenden, wird das Problem gelöst und es besteht keine Notwendigkeit für ein GROUP BY außerhalb der abgeleiteten Tabellen/Inline-Ansichten.