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

MySQL单查询多值计算:基于User与Posts一对多关系统计不同发帖量的用户数

用单条MySQL语句实现用户发帖统计需求

当然可以用一条MySQL语句搞定这个统计需求!先纠正下你描述里的小笔误:用户3发布1篇帖子的话,应该是仅至少1篇帖子的用户数统计列加1,而不是“超过1篇”的,应该是输入时的疏忽啦。

核心思路

我们可以分两步实现:

  • 先统计每个用户的发帖数量,得到每个用户的发帖数明细;
  • 基于这个明细,按用户分类进行条件聚合,分别统计「至少1篇」和「超过1篇」的用户数量。

假设表结构

先明确下两张表的核心字段(如果你的字段名不同,替换成实际字段即可):

  • User表:user_id(用户ID,主键)、category(用户分类,比如Design/Engineering)
  • Posts表:post_id(帖子ID,主键)、user_id(关联用户的外键)

最终查询语句

SELECT
    u.category,
    COUNT(DISTINCT u.user_id) AS at_least_one_post,
    SUM(CASE WHEN p.post_count > 1 THEN 1 ELSE 0 END) AS more_than_one_post
FROM
    User u
INNER JOIN (
    -- 子查询:统计每个用户的发帖总数
    SELECT user_id, COUNT(*) AS post_count
    FROM Posts
    GROUP BY user_id
) p ON u.user_id = p.user_id
GROUP BY u.category;

语句解释

  • 子查询p:通过GROUP BY user_id统计每个用户的发帖数量,得到每个用户的post_count。
  • INNER JOIN:确保只关联有发帖记录的用户(也就是至少发过1篇帖子的用户),过滤掉没有发帖的用户。
  • COUNT(DISTINCT u.user_id):统计每个分类下至少发1篇帖子的用户数,因为每个用户在子查询里只会出现一次,去重是为了避免意外的重复(如果你的关联逻辑没问题,其实也可以直接用COUNT(u.user_id))。
  • SUM(CASE...):用条件判断来统计发帖数超过1篇的用户——当post_count > 1时记为1,否则记为0,求和后就是对应分类下符合条件的用户数量。

测试结果验证

用你给出的示例用户数据测试:

  • 用户1(Design,3篇)、用户2(Engineering,2篇)、用户3(Design,1篇)
    查询结果会是:
categoryat_least_one_postmore_than_one_post
Design21
Engineering11

完全符合预期:Design分类下至少1篇的用户有2个(用户1和3),超过1篇的只有用户1;Engineering分类下两个统计值都是1(用户2)。

内容的提问来源于stack exchange,提问作者Hussam Khatib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:59:06