如何将4条用户相关SQL统计查询合并为单条查询?
合并用户基础信息与多维度统计的SQL方案
完全可以合并为单条查询,你之前的尝试存在两个核心问题:
- 语法错误:
login和count(question.id)后缺少逗号,导致SQL无法解析; - 逻辑错误:多表直接
INNER JOIN会产生笛卡尔积,比如一个用户有2条提问、3条回答,连接后会生成6条重复记录,最终count出的数值远大于实际数量;同时INNER JOIN会过滤掉没有提问/回答/评论的用户,和原查询返回所有用户的逻辑不符。
推荐方案一:子查询预统计后关联(适合大数据量场景)
先分别统计每个用户的提问、回答、评论数,再通过LEFT JOIN关联到用户表,确保所有用户都被保留,无对应数据时显示0:
SELECT u.id AS id, u.registration_date, u.login, COALESCE(q.question_number, 0) AS question_number, COALESCE(a.answer_number, 0) AS answer_number, COALESCE(c.comment_number, 0) AS comment_number FROM users u LEFT JOIN ( SELECT user_id, COUNT(id) AS question_number FROM question GROUP BY user_id ) q ON q.user_id = u.id LEFT JOIN ( SELECT user_id, COUNT(id) AS answer_number FROM answer GROUP BY user_id ) a ON a.user_id = u.id LEFT JOIN ( SELECT user_id, COUNT(id) AS comment_number FROM comment GROUP BY user_id ) c ON c.user_id = u.id ORDER BY u.id;
推荐方案二:关联子查询作为字段(写法更简洁)
直接在SELECT字段中嵌入子查询,每个子查询单独统计对应用户的数量,自动处理无数据的情况(返回NULL,可加COALESCE转为0):
SELECT id, registration_date, login, COALESCE((SELECT COUNT(id) FROM question WHERE user_id = users.id), 0) AS question_number, COALESCE((SELECT COUNT(id) FROM answer WHERE user_id = users.id), 0) AS answer_number, COALESCE((SELECT COUNT(id) FROM comment WHERE user_id = users.id), 0) AS comment_number FROM users ORDER BY id;
关键说明
- 使用
LEFT JOIN而非INNER JOIN:确保即使用户没有提问、回答或评论,也能保留其基础信息; COALESCE函数:将NULL值转为0,避免统计结果出现空值;- 避免直接多表连接统计:防止笛卡尔积导致的统计数值失真。
内容的提问来源于stack exchange,提问作者Rafał Krawczyk
相关产品推荐
相关产品推荐

