繁体   English   中英

使用Sakila的子查询问题

[英]Problems with subqueries using Sakila

使用Sakila数据库,我试图获取国家名称,一个国家拥有的城市数以及一个国家的地址数

使用下一个查询,我可以获得国家和城市号码

 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;

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

这实际上是一个棘手的问题。 只需稍加修改, 即可使您的加入方法生效。 每个国家/地区组的总数将给出该国家/地区的地址数。 但是要获得一个国家的城市数,我们可以计算每个国家组中不同的城市名称。 这里需要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;

您可以使用下面的子查询获得结果。 这基本上是显示如何编写它。 建议使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM