如何编写SQL查询关联6张表,统计各国用户及学科订阅数据
解决方案
没问题,我来帮你搞定这个统计需求。首先得确保我们能覆盖所有国家(哪怕这个国家没有用户也要显示出来),同时准确计算各个指标,下面是完整的SQL查询语句:
SELECT c.short_name AS 国家名称, COUNT(DISTINCT u.id) AS 总用户数, SUM(CASE WHEN u.status = 2 THEN 1 ELSE 0 END) AS 活跃用户数, SUM(CASE WHEN u.status = 1 THEN 1 ELSE 0 END) AS 非活跃用户数, COUNT(DISTINCT usd.user_id) AS 学科订阅用户数 FROM countries c LEFT JOIN `user` u ON c.country_id = u.country_id LEFT JOIN user_subscribed_disciplines usd ON u.id = usd.user_id GROUP BY c.country_id, c.short_name ORDER BY c.short_name;
关键逻辑说明:
- 覆盖所有国家:用
LEFT JOIN关联countries和user表,确保即使某个国家没有任何用户,也会出现在结果里,对应的用户数指标会显示为0。 - 总用户数:用
COUNT(DISTINCT u.id)避免重复统计(虽然user.id是主键,但加上DISTINCT更保险,防止意外关联导致的重复行)。 - 活跃/非活跃用户数:用
CASE WHEN配合SUM精准统计符合状态条件的用户数量,对应你给出的规则:status=2为活跃,status=1为非活跃。 - 学科订阅用户数:通过关联
user_subscribed_disciplines表,统计有至少一条学科订阅记录的用户数,DISTINCT能避免同一个用户因订阅多个学科被多次统计。
另外提个小细节:你写的disciplin表名可能是笔误?我默认写成discipline了,如果实际表名就是disciplin,你把查询里的关联部分改过来就行。还有user是SQL的关键字,所以用反引号`把它括起来,避免语法报错。
内容的提问来源于stack exchange,提问作者Karen
相关产品推荐
相关产品推荐

