MySQL - 使用LEFT JOIN和group进行查询,不返回计数0的行

时间:2017-09-16 17:45:46

标签: mysql sql

我正在运行下面提到的查询。

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社区版。 提前谢谢。

3 个答案:

答案 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 NULLc.codeNOT 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)