Sử dụng:
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
Bạn phải sử dụng kết nối OUTER để điều này nằm trong một truy vấn; Việc tham gia INNER cho tất cả các bảng sẽ yêu cầu người dùng có ít nhất một bản ghi trong bảng FILES, PHOTOS và GROUPS để có trong tập kết quả. Tham gia OUTER có nghĩa là người dùng có bản ghi trong ít nhất một trong các bảng (LỌC, ẢNH hoặc NHÓM) sẽ được trả về.
Nhưng JOIN cũng có nguy cơ thổi phồng tập kết quả, đây là vấn đề đã xảy ra trong phiên bản trước của câu trả lời của tôi. Bằng cách thay đổi truy vấn để sử dụng bảng dẫn xuất / chế độ xem nội tuyến cho số lượng LỌC, NHÓM và ẢNH, vấn đề đã được giải quyết và không cần NHÓM BY bên ngoài bảng dẫn xuất / chế độ xem nội tuyến.