You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计一对多关联下各职位分类对应的职位数量?

统计每个职位分类的职位数量

这是个非常常见的关联统计需求,咱们用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:51:06