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篇)
查询结果会是:
| category | at_least_one_post | more_than_one_post |
|---|---|---|
| Design | 2 | 1 |
| Engineering | 1 | 1 |
完全符合预期:Design分类下至少1篇的用户有2个(用户1和3),超过1篇的只有用户1;Engineering分类下两个统计值都是1(用户2)。
内容的提问来源于stack exchange,提问作者Hussam Khatib
相关产品推荐
相关产品推荐

