如何仅用子查询查询报名人数≥10的课程?
仅用子查询实现课程报名人数统计的方案
一、仅用子查询实现需求的SQL写法
由于要求禁用GROUP BY、JOIN和集合操作,我们可以利用相关子查询逐个统计每门课程的报名人数,再筛选出人数≥10的课程:
SELECT c.name, (SELECT COUNT(*) FROM Course_Signup csn WHERE csn.course_id = c.id) AS signup_count FROM Courses c WHERE (SELECT COUNT(*) FROM Course_Signup csn WHERE csn.course_id = c.id) >= 10;
逻辑很直接:遍历Courses表的每一门课程,通过子查询匹配Course_Signup中对应课程的报名记录数,最后只保留报名人数≥10的课程信息。
二、除COUNT外的报名人数统计方法
除了COUNT函数,最实用的替代方法是用SUM函数:
SELECT c.name, (SELECT SUM(1) FROM Course_Signup csn WHERE csn.course_id = c.id) AS signup_count FROM Courses c WHERE (SELECT SUM(1) FROM Course_Signup csn WHERE csn.course_id = c.id) >= 10;
这里SUM(1)的作用是每匹配到一条报名记录就累加1,最终结果和COUNT(*)完全一致,本质都是统计符合条件的行数。
另外还有一种思路拓展性的方法(不推荐实际使用):通过子查询生成行号,取最大行号作为报名人数,但实现繁琐且效率低下,实际工作中优先用COUNT或SUM(1)即可。
内容的提问来源于stack exchange,提问作者Andrei0408
相关产品推荐
相关产品推荐

