如何让MySQL的SELECT COUNT()统计并返回无授课记录的讲师数据?
解决MySQL统计所有讲师授课数量的问题
你当前的查询只返回有授课记录的讲师,核心问题出在连接类型和分组逻辑上,以下是修正方案:
关键修改点
- 改用左外连接(LEFT JOIN):原查询用的
JOIN是内连接,只会保留两张表匹配的记录。换成LEFT JOIN SECTION后,INSTRUCTOR表的所有讲师都会被返回,哪怕SECTION里没有对应的授课记录。 - 修正GROUP BY分组字段:原语句按
SECTION.INSTRUCTOR_ID分组,无授课的讲师这个字段是NULL,会导致分组错误;同时别名不能直接用于GROUP BY。应该按INSTRUCTOR表的唯一标识(比如INSTRUCTOR_ID)以及SELECT里的非聚合字段分组,符合SQL标准。 - COUNT函数保持有效:
COUNT(SECTION.INSTRUCTOR_ID)会自动忽略NULL值,无授课的讲师会统计出0,正好符合需求。
修正后的完整SQL
SELECT CONCAT(INSTRUCTOR.INSTRUCTOR_ID, ' ', INSTRUCTOR.FIRST_NAME, ' ', INSTRUCTOR.LAST_NAME) AS Instructor, CONCAT(SUBSTRING(INSTRUCTOR.INSTRUCTOR_SSN, 1, 3), '-', SUBSTRING(INSTRUCTOR.INSTRUCTOR_SSN, 4, 2), '-', SUBSTRING(INSTRUCTOR.INSTRUCTOR_SSN, 6, 4)) AS 'Instructor SSN', COUNT(SECTION.INSTRUCTOR_ID) AS '# of Sections' FROM INSTRUCTOR LEFT JOIN SECTION ON INSTRUCTOR.INSTRUCTOR_ID = SECTION.INSTRUCTOR_ID GROUP BY INSTRUCTOR.INSTRUCTOR_ID, Instructor, 'Instructor SSN';
如果你的MySQL版本支持仅按主键分组(关闭ONLY_FULL_GROUP_BY或使用宽松模式),也可以简化GROUP BY为GROUP BY INSTRUCTOR.INSTRUCTOR_ID,因为主键唯一确定其他字段的值。
内容的提问来源于stack exchange,提问作者Zachary Tucker
相关产品推荐
相关产品推荐

