如何统计一对多关联下各职位分类对应的职位数量?
统计每个职位分类的职位数量
这是个非常常见的关联统计需求,咱们用SQL就能轻松实现,我分两种常见场景给你说明,确保覆盖所有情况:
1. 只统计有职位的分类(排除无职位的分类)
用INNER JOIN关联两张表,只保留两边都有匹配数据的记录,再用聚合函数统计数量:
SELECT jc.id AS category_id, jc.name AS category_name, COUNT(j.id) AS job_count FROM job_category jc INNER JOIN jobs j ON jc.id = j.job_category GROUP BY jc.id, jc.name ORDER BY job_count DESC;
关键说明:
INNER JOIN会匹配job_category.id和jobs.job_category相等的记录,自动过滤掉没有对应职位的分类。COUNT(j.id)用来统计每个分类下的有效职位数,它只会统计jobs表中存在的非NULL id值。GROUP BY jc.id, jc.name是按分类的唯一标识(id)和名称分组,既避免同名分类的统计混乱,也符合大多数数据库的分组规则(比如MySQL的ONLY_FULL_GROUP_BY模式)。- 最后用
ORDER BY job_count DESC按职位数量从多到少排序,方便快速查看热门分类。
2. 显示所有分类(包括无职位的分类,数量显示为0)
如果需要保留所有分类,哪怕这个分类下没有任何职位,就用LEFT JOIN:
SELECT jc.id AS category_id, jc.name AS category_name, COUNT(j.id) AS job_count FROM job_category jc LEFT JOIN jobs j ON jc.id = j.job_category GROUP BY jc.id, jc.name ORDER BY job_count DESC;
关键说明:
LEFT JOIN会保留job_category表的所有记录,哪怕jobs表中没有对应匹配的职位数据。- 这里必须用
COUNT(j.id)而不是COUNT(*):当没有匹配的职位时,j.id会是NULL,COUNT(j.id)会自动忽略这些NULL值,统计结果为0;如果用COUNT(*),会把这些空行统计为1,结果就不准确了。
额外注意事项
- 确保
jobs.job_category字段和job_category.id字段的类型一致,否则可能出现关联匹配错误。 - 如果你的数据库支持
COALESCE函数,也可以把COUNT(j.id)写成COALESCE(COUNT(j.id), 0),不过实际上COUNT(j.id)本身已经会返回0,这个写法更多是为了提升可读性。
内容的提问来源于stack exchange,提问作者Terchila Marian
相关产品推荐
相关产品推荐

