我正在运行下面提到的查询。
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社区版。 提前谢谢。
答案 0 :(得分:1)
您想要按国家/地区计算机场数量,包括那些没有机场的机场,对吧?
试试这个:
SELECT
c.id, c.code, c.name, count(a.iso_country) AS airport_count
FROM
countries c LEFT JOIN airports a ON c.code = a.iso_country
GROUP BY
c.id, c.code, c.name
ORDER BY
airport_count DESC;
答案 1 :(得分:0)
它可能与NULL值有关吗?您的a.iso_country
列为DEFAULT NULL
,c.code
为NOT NULL
。通常在比较值时,如果其中任何一个可以是NULL
,则您希望使用类似COALESCE
的内容来提供值为NULL
的第二个选项。原因是NULL != ''
和NULL != 0
。如果您加入COALESCE(a.iso_country, '') = COALESCE(c.code, '')
该怎么办?
我还不确定COUNT
给出NULL
时的行为。{1}}。你可能需要小心。
答案 2 :(得分:0)
你可以尝试在where子句中检查这个条件吗。明确检查表中没有找到机场的null。
where (airports.name.is null)