MySQL-通过不返回计数为0的行进行左连接和分组的查询

MySQL-通过不返回计数为0的行进行左连接和分组的查询,mysql,sql,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_国家”列映射到“国家”表中的“代码”列 下表是定义。 国家表- CRE

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

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_国家”列映射到“国家”表中的“代码”列

下表是定义。 国家表-

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`) )
机场表-

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

这可能与空值有关吗?您的
a.iso_country
列为
DEFAULT NULL
c.code
列为
NOT NULL
。通常,在比较值时,如果其中一个值可以是
NULL
,则希望在值为
NULL
的情况下使用类似于
COALESCE
的内容来提供第二个选项。原因是
NULL!=''
NULL!=0
。如果您加入联合(a.iso_country,)=联合(c.code,)


我也不确定
COUNT
在给定
NULL
时的行为。您可能需要小心。

是否可以尝试在where子句中检查此条件。在未找到机场的表中隐式检查null

where (airports.name.is null)

你需要按国家统计机场数量,包括那些没有机场的机场,对吗

试试这个:

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;

为什么将其与iso_国家/地区分组??你想按国家分组吗?@MohammadMirzaeyan-是的,我想计算每个国家的机场数量“airports”表的“iso_country”列映射到“countries”表的“code”列。因此,我认为首先最好在“countries”表中按代码字段对其进行分组,并用该更改修复您的订单,而不是使用“count(a.iso_country)”。使用“count(*)”@MohammadMirzaeyan-您是对的。group by应位于“国家”。代码,但需要计数(a.iso_country),以便我了解一个国家是否包含0个机场。旁注:为什么在两个表中都存储大陆?从iso_country为空的机场中选择*;它的输出是返回的0行。@谢谢你发现了这一点,我从问题中留下了它。同意不需要,并更新了我的答案。很高兴。我们凯莉必须互相照顾;-)