如何在中间父表上使用GROUP BY关联多层父表?
多层关联表的公民统计查询解决方案
看起来你已经搭好了查询的框架,只差把表关联和聚合统计的部分补全了。这里给你一份完整的SQL语句,刚好能输出你想要的结果结构:
SELECT country.name AS country_name, state.name AS state_name, city.name AS city_name, COUNT(citizen.id) AS citizens FROM country INNER JOIN state ON country.id = state.country_id INNER JOIN city ON state.id = city.state_id INNER JOIN citizen ON city.id = citizen.city_id GROUP BY country.name, state.name, city.name;
关键细节说明:
- 表关联逻辑:我们用
INNER JOIN依次把四张表通过各自的外键关联起来——国家和州通过country.id = state.country_id,州和城市通过state.id = city.state_id,城市和公民通过city.id = citizen.city_id。如果你的场景需要包含没有公民的城市(统计数显示为0),可以把最后一个INNER JOIN改成LEFT JOIN。 - 聚合统计:
COUNT(citizen.id)用来精准统计每个城市的公民数量,选择citizen.id而非*是为了避免在使用LEFT JOIN时把NULL值也算入统计。 - 分组规则:
GROUP BY子句是必须的,因为我们使用了聚合函数COUNT,需要按国家、州、城市的名称分组,才能得到每个城市对应的独立统计结果。如果存在不同实体名称重复的情况(比如两个不同国家有同名的州),建议把ID也加入分组条件,确保统计的准确性:GROUP BY country.id, state.id, city.id, country.name, state.name, city.name;
内容的提问来源于stack exchange,提问作者Satyajeet Kanetkar
相关产品推荐
相关产品推荐

