使用Sakila DB,我想获取国家/地区名称,某个国家/地区的城市数量以及国家/地区的地址数量
使用下一个查询,我会获得国家/地区和城市号码
SELECT CO.country,COUNT(CI.city_id)
FROM city CI
INNER JOIN country CO ON CO.country_id = CI.country_id
GROUP BY CO.country;
使用另一个我得到地址编号
SELECT CO.country,COUNT(A.address_id)
FROM city CI
INNER JOIN address A ON A.city_id=CI.city_id
INNER JOIN country CO ON CI.country_id=CO.country_id
GROUP BY CO.country;
我被暗示使用子查询来获得所需的结果,但我找不到如何在一个表中获得所有这些。有什么建议?
答案 0 :(得分:0)
这实际上是一个棘手的问题。您的加入方法可以使用,只需稍作修改即可。每个国家/地区组的总计数将给出该国家/地区的地址数量。但是为了获得一个国家的城市数量,我们可以计算每个国家/地区组中的不同城市名称。这里对DISTINCT
的需求是,地址表的连接将导致每个城市名称被复制,但是在给定城市中出现的地址很多次。以明显的城市数量来解决这个问题。
SELECT
co.country_id,
COUNT(DISTINCT ci.city_id) AS city_cnt,
COUNT(a.city_id) AS address_cnt
FROM country co
INNER JOIN city ci
ON co.country_id = ci.country_id
INNER JOIN address a
ON ci.city_id = a.city_id
GROUP BY
co.country_id;
答案 1 :(得分:0)
您可以使用以下子查询来实现结果。这基本上是为了展示你如何编写它。它推荐使用join(参考Tim Biegeleisen的回答)而不是Sub查询,因为它提供了良好的性能。
select
Co.Country,
(Select COUNT(1) from City Ci where Ci.countryid=co.countryid) CityCount,
(Select COUNT(1) from Address A Join city c on a.city_id=c.city_id where C.countryid=co.countryid) AddressCount
From Country Co