如何基于多表关联子查询统计同一国家用户的订阅总数?
按国家统计用户订阅总数(基于多结果子查询实现)
嘿,我来帮你搞定这个统计需求!咱们先理清楚表之间的关联逻辑: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
相关产品推荐
相关产品推荐

