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

如何基于多表关联子查询统计同一国家用户的订阅总数?

按国家统计用户订阅总数(基于多结果子查询实现)

嘿,我来帮你搞定这个统计需求!咱们先理清楚表之间的关联逻辑:user_subscribe和user通过user_id关联,user又靠country_id和country绑定。你需要用返回多结果的子查询来实现统计,这里给你两种实用的写法:

方法1:子查询作为临时数据集关联统计

这种方式先通过子查询把用户和所属国家的对应关系拉出来,再和订阅表关联分组统计:

SELECT 
    c.country_id,
    COUNT(us.user_id) AS total_subscribe_count
FROM 
    country c
-- 子查询返回所有用户及其所属国家的数据集
JOIN 
    (SELECT u.user_id, u.country_id FROM `user` u) AS user_country_map
ON 
    c.country_id = user_country_map.country_id
-- 关联订阅表,统计每个国家的订阅数
LEFT JOIN 
    user_subscribe us
ON 
    user_country_map.user_id = us.user_id
GROUP BY 
    c.country_id;
  • 这里用LEFT JOIN是为了保证即使某个国家没有用户订阅,也会显示该国家ID和0条订阅;如果只需要统计有订阅记录的国家,换成INNER JOIN即可。
  • 用COUNT(us.user_id)而非COUNT(*)是因为LEFT JOIN会产生NULL值,前者只会统计有实际订阅记录的条目,结果更准确。

方法2:用IN子查询过滤有效国家后统计

如果想通过子查询过滤出所有合法的国家ID,再基于这个范围统计订阅数,可以这么写:

SELECT 
    u.country_id,
    COUNT(*) AS total_subscribe_count
FROM 
    user_subscribe us
JOIN 
    `user` u ON us.user_id = u.user_id
-- 子查询返回所有存在的国家ID,确保统计的是有效国家数据
WHERE 
    u.country_id IN (SELECT country_id FROM country)
GROUP BY 
    u.country_id;

这里的子查询(SELECT country_id FROM country)返回所有合法的国家ID,用来过滤用户所属的国家,避免统计到无效的country_id(如果user表的country_id有外键约束的话,这个子查询可以省略,但加上它能让逻辑更严谨)。

额外提示

如果你的country表有国家名称这类字段,只要在SELECT和GROUP BY里加上对应的字段(比如c.country_name),就能同时显示国家名称和订阅数啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:04:16