【发布时间】:2017-09-17 07:45:29
【问题描述】:
我正在运行下面提到的查询。
select c.id, c.code, c.name, count(a.iso_country) from countries c
left join airports a on c.code = a.iso_country group by a.iso_country
order by count(a.iso_country);
在我的“国家”表中,我有 247 行。 在“机场”表中,“iso_country”列映射到“国家”表中的“代码”列。
以下是表定义。 国家表 -
CREATE TABLE `countries` (
`id` int(11) NOT NULL,
`code` varchar(2) NOT NULL,
`name` text,
`continent` text,
PRIMARY KEY (`id`),
UNIQUE KEY `code_UNIQUE` (`code`),
KEY `code_idx` (`code`)
)
机场表 -
CREATE TABLE `airports` (
`id` int(11) NOT NULL,
`type` text,
`name` text,
`continent` text,
`iso_country` varchar(2) DEFAULT NULL,
`iso_region` text,
PRIMARY KEY (`id`),
KEY `country_iso_code_fk_idx` (`iso_country`),
CONSTRAINT `country_fk` FOREIGN KEY (`iso_country`) REFERENCES `countries`
(`code`) )
我面临的问题是 - 我上面提到的查询返回 242 个国家/地区 - 241 个国家/地区有机场,1 个国家/地区的“机场”为空值,但不包括其他 5 个也没有任何机场的国家/地区.请指导我在此查询中做错了什么。
PS:- 我只是 SQL 的新手。
我在 MySQL 5.7 Community Edition 上运行。 提前致谢。
【问题讨论】:
-
为什么将它与 iso_country 分组?你想按国家分组吗?
-
@MohammadMirzaeyan - 是的,我想计算每个国家的机场。 'airports' 表的 'iso_country' 列映射到 'countries' 表的 'code' 列。
-
所以我认为首先最好按“国家”表上的代码字段对其进行分组,并使用该更改来修复您的订单,而不是“计数(a.iso_country)”使用“计数( *)'
-
@MohammadMirzaeyan - 你是对的。 group by 应该在 'countries'.code 上,但 count(a.iso_country) 是必需的,这样我才能了解一个国家/地区是否包含 0 个机场。
-
旁注:为什么在两个表中都存储大陆?