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

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后,会得到类似这样的表格:

countrystudent_count
GB8
ZA8
US8
RU8
PN8

如果还需要额外统计唯一国家的总数量,可以用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:08:49