双表统计职位申请数视图异常:无申请职位未显示(应显示0)
解决无申请记录职位不显示的问题
你碰到的核心问题是连接类型选错了——原语句里的JOIN是内连接(INNER JOIN),它只会返回两张表中能匹配上job_id的记录,没有申请的职位在application表中找不到对应条目,自然就被过滤掉了。
要让所有开放状态的职位都显示出来,哪怕申请数为0,我们需要改成左外连接(LEFT JOIN),以职位表作为主表,具体修改后的SQL如下:
SELECT COUNT(a.job_id) AS "no. of applicants", p.job_id, p.status, p.JOB_TYPE, p.EMPLOYER_ID FROM job p LEFT JOIN application a ON a.job_id = p.job_id WHERE p.status = 'OPEN' GROUP BY p.job_id, p.status, p.JOB_TYPE, p.EMPLOYER_ID;
关键修改点解释:
- 调整连接顺序与类型:把
job表放在FROM后,用LEFT JOIN关联application。这样所有status='OPEN'的职位都会被保留,不管有没有对应的申请记录。 - COUNT函数的作用:当没有匹配的申请时,
a.job_id会是NULL,而COUNT()会自动忽略NULL值,返回0,正好满足你要显示申请数为0的需求。 - GROUP BY保持不变:因为我们是按职位的唯一标识和相关属性分组,确保每个职位只返回一条统计结果。
如果你的数据库对GROUP BY有严格要求(比如MySQL开启了ONLY_FULL_GROUP_BY模式),当前的GROUP BY子句已经包含了所有非聚合字段,完全符合规范。
内容的提问来源于stack exchange,提问作者Sam Turner
相关产品推荐
相关产品推荐

