MySQL如何按科目统计各志愿偏好对应的选择人数
MySQL 分科目统计各志愿梯度选择人数
核心实现思路
基于科目表做主表左关联志愿填报数据,通过条件聚合按志愿优先级分别计数,保证所有科目都能出现在统计结果中,不会遗漏无人填报的科目。
可直接运行的SQL代码
注意:如果你的学生志愿偏好关联表有自定义正式表名,替换SQL中对应的表名即可
SELECT m.subName AS SubName, COUNT(CASE WHEN p.Preferences = 1 THEN p.student_id END) AS `Preference 1 Count`, COUNT(CASE WHEN p.Preferences = 2 THEN p.student_id END) AS `preference 2`, COUNT(CASE WHEN p.Preferences = 3 THEN p.student_id END) AS `preference 3` FROM majorsubjects m LEFT JOIN student_preference_relation p -- 此处替换为你实际的志愿关联表表名 ON m.id = p.subject_id GROUP BY m.id, m.subName;
基于提供的测试数据的返回结果
| SubName | Preference 1 Count | preference 2 | preference 3 |
|---|---|---|---|
| sub1 | 0 | 1 | 0 |
| sub2 | 2 | 0 | 0 |
| sub3 | 0 | 0 | 1 |
| sub4 | 0 | 1 | 1 |
逻辑说明
- 采用
LEFT JOIN关联主修科目表和志愿关联表,确保即使某科目没有任何学生填报,也会在结果中显示,对应三个志愿的人数为0 - 分组字段同时使用科目主键
id和科目名称subName,避免不同科目重名导致统计结果错误 - 条件计数时统计非空的学生ID,自动排除不匹配志愿梯度的NULL值,统计结果准确
- 不需要关联学生表,因为志愿关联表中已经有
student_id可以直接计数(业务规则为每位学生每个梯度只填1个志愿,不存在重复数据,直接计数即可)
内容的提问来源于stack exchange,提问作者BABA
相关产品推荐
相关产品推荐

