求助:如何筛选MySQL子查询中attended_courses为0的行?
解决方法:筛选出attended_courses = 0的行
嗨,很高兴能帮到你!你现在要筛选出attended_courses等于0的行,这里有两种靠谱的方法,我都给你详细说明下:
方法一:使用HAVING子句(基于你原有的查询修改)
因为attended_courses是通过子查询计算出来的衍生列,WHERE子句在SQL执行顺序中早于SELECT,所以无法直接引用这个别名来过滤。而HAVING子句是在SELECT之后执行的,刚好能解决这个问题。修改后的查询语句如下:
SELECT id, lastname, firstname, (SELECT COUNT(courses.id) FROM courses LEFT JOIN members_courses ON courses.id = members_courses.course_id WHERE members_courses.member_id = members.id) AS attended_courses FROM members HAVING attended_courses = 0 LIMIT 10;
方法二:改用LEFT JOIN重写查询(性能更优)
如果你的数据量比较大,用JOIN的方式替代子查询通常会有更好的性能,写法也更直观。这里我们通过关联表后分组统计,再筛选出课程数量为0的成员:
SELECT m.id, m.lastname, m.firstname, COUNT(c.id) AS attended_courses FROM members m LEFT JOIN members_courses mc ON m.id = mc.member_id LEFT JOIN courses c ON mc.course_id = c.id GROUP BY m.id, m.lastname, m.firstname HAVING COUNT(c.id) = 0 LIMIT 10;
两种方法都能达到你的需求,你可以根据自己的实际场景选择合适的方式~
内容的提问来源于stack exchange,提问作者Alessio De Feudis
相关产品推荐
相关产品推荐

