2017-09-16 85 views
0

我在下面提到的查詢中運行。MySQL - 使用LEFT JOIN進行查詢並通過不返回行數進行計數0

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'列映射到'國家/地區'表中的'代碼'列。

以下是表格的定義。 Countries表 -

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

爲什麼你組呢??:

試試這個你想按國家分組嗎? –

+0

@MohammadMirzaeyan - 是的,我想爲每個國家的機場數。 「機場」表的'iso_country'列映射到'國家'表的'代碼'列。 –

+1

所以我認爲首先最好是通過'國家'表上的代碼字段進行分組,然後使用'count(*)'來修改您的訂單,而不是'count(a.iso_country)' –

回答

1

你想按國家計算機場數量,包括那些沒有的機場數量,對不對?與iso_country

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; 
+0

@Strawberry感謝您發現,我已將其留在問題中。同意這不是必要的,並已更新我的答案。 –

+0

高興。我們凱瑞必須相互注意;-) – Strawberry

0

它可以與NULL值有關嗎?您的a.iso_country列是DEFAULT NULLc.codeNOT NULL。通常,在比較值時,如果其中任一個可以是NULL,則在想要使用類似COALESCE的情況下,如果值爲NULL,則提供第二個選項。造成這種情況的原因是NULL != ''NULL != 0。如果你加入COALESCE(a.iso_country, '') = COALESCE(c.code, '')怎麼辦?

我也不確定COUNT在給定NULL時的行爲。你可能需要在那裏小心。

+0

從iso_country IS NULL的機場中選擇*; 其輸出爲0行(s)返回。 –

0

你可以嘗試在where子句中檢查這個條件。在沒有找到機場的表中顯式檢查null。

where (airports.name.is null)