You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将4条用户相关SQL统计查询合并为单条查询?

合并用户基础信息与多维度统计的SQL方案

完全可以合并为单条查询,你之前的尝试存在两个核心问题:

  1. 语法错误:login和count(question.id)后缺少逗号,导致SQL无法解析;
  2. 逻辑错误:多表直接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:12:13