使用Sakila的子查询问题

时间:2018-02-23 05:36:21

标签: mysql sql

使用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;

我被暗示使用子查询来获得所需的结果,但我找不到如何在一个表中获得所有这些。有什么建议?

2 个答案:

答案 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