MySQL查询错误排查:如何统计各国家的唯一学生数量?
如何统计唯一国家数量及对应学生数?SQL语句纠错
嘿,我来帮你梳理下问题出在哪,以及怎么调整成你想要的结果~
首先看你写的SQL:
select COUNT(country) as T from (select country from rs_user where Email in ( select distinct(Email) from rs_active_course))
它的问题主要有这几点:
- 没有按国家分组:外层用
COUNT(country)只会返回所有记录的总条数,而没法拆分出每个国家对应的学生数——这是你得不到目标表格结果的核心原因。 - 未处理重复数据:子查询里的
select country没有去重,如果同一个学生(同一个邮箱)在rs_user里有多条相同国家的记录,会被重复统计,导致结果偏大。 - 逻辑冗余:嵌套子查询的写法可以简化,而且效率不如直接关联或分组统计。
正确的SQL写法
这里给你两种实用的写法,都能输出你想要的「国家+对应学生数」格式:
写法1:用WHERE IN + GROUP BY
SELECT country, COUNT(DISTINCT Email) AS student_count FROM rs_user WHERE Email IN (SELECT DISTINCT Email FROM rs_active_course) GROUP BY country ORDER BY student_count DESC;
GROUP BY country:按国家分组,确保每个国家只出现在一行结果里。COUNT(DISTINCT Email):统计每个国家下的唯一学生数(避免同一个邮箱被多次统计)。- WHERE子句:过滤出在
rs_active_course里的活跃学生。
写法2:用JOIN关联(性能更优)
如果你的数据量比较大,推荐用JOIN的方式,逻辑更清晰,执行效率也更高:
SELECT u.country, COUNT(DISTINCT u.Email) AS student_count FROM rs_user u JOIN (SELECT DISTINCT Email FROM rs_active_course) ac ON u.Email = ac.Email GROUP BY u.country ORDER BY student_count DESC;
先从rs_active_course里提取唯一的活跃邮箱作为临时表ac,再和rs_user关联,最后按国家分组统计。
预期输出结果
执行上面的SQL后,会得到类似这样的表格:
| country | student_count |
|---|---|
| GB | 8 |
| ZA | 8 |
| US | 8 |
| RU | 8 |
| PN | 8 |
如果还需要额外统计唯一国家的总数量,可以用CTE(公共表表达式)来实现:
WITH country_stats AS ( SELECT u.country, COUNT(DISTINCT u.Email) AS student_count FROM rs_user u JOIN (SELECT DISTINCT Email FROM rs_active_course) ac ON u.Email = ac.Email GROUP BY u.country ) -- 同时输出每个国家的统计和总国家数 SELECT '国家统计' AS type, country, student_count FROM country_stats UNION ALL SELECT '汇总' AS type, '总计' AS country, COUNT(*) AS student_count FROM country_stats;
内容的提问来源于stack exchange,提问作者Psymon
相关产品推荐
相关产品推荐

