MySQL中如何统计同一张表内被引用项的数量?
MySQL中如何统计同一张表内被引用项的数量?
嗨,完全懂这种熬到脑子转不动的感觉!别慌,这个同表自关联统计的问题其实没那么复杂,咱们一步步来搞定它~
首先回顾下你的需求:你有一个persons表,里面的father_id关联了同表中父亲的id,想要统计每个父亲的孩子数量,包括像Eric那种没有孩子的情况(显示0)。
核心思路
其实关键就是把同一张表当成两个独立的表来用:一个作为「父亲表」,一个作为「孩子表」,通过自连接建立两者的关联关系,再分组统计每个父亲对应的孩子总数。
实现代码
直接用这个查询语句就能得到你想要的结果:
SELECT p.id, p.name, COUNT(c.id) AS child_count FROM persons p LEFT JOIN persons c ON p.id = c.father_id WHERE p.isfather = 1 GROUP BY p.id, p.name ORDER BY p.id;
代码解释
- 自连接部分:
LEFT JOIN persons c ON p.id = c.father_id
这里给原表起了两个别名p(代表父亲)和c(代表孩子),关联条件是父亲的id等于孩子的father_id。用LEFT JOIN是关键——它能保证即使某个父亲没有任何孩子,也会出现在结果里,此时对应的孩子数会显示为0。 - 筛选父亲:
WHERE p.isfather = 1
这一步是筛选出所有标记为父亲的记录,完全匹配你给出的示例需求(John、Mike、Eric)。 - 统计数量:
COUNT(c.id)
统计每个父亲对应的孩子数量,因为如果没有孩子,c.id会是NULL,而COUNT函数会自动忽略NULL值,所以结果自然就是0,正好符合Eric的情况。 - 分组排序:
GROUP BY p.id, p.name+ORDER BY p.id
按父亲的id和姓名分组,确保每个父亲只出现一次,最后按id排序让结果更清晰。
测试结果
用你提供的测试数据运行这个查询,会得到如下结果:
| id | name | child_count |
|---|---|---|
| 1 | John | 3 |
| 2 | Mike | 2 |
| 8 | Eric | 0 |
完全符合你想要的John有3个孩子、Mike有2个、Eric有0个的需求~
备注:内容来源于stack exchange,提问作者Gowire
相关产品推荐
相关产品推荐

