2016-12-01 174 views
0

我试图从包含外表中的外观计数的表中获取结果。此表可以有0个或更多外观。用LEFT JOIN和GROUP BY COUNT(*)在MySQL中包含NULL

像下面的例子:

表:颜色

+------+---------+ 
| id | name | 
+------+---------+ 
| 1 | red | 
| 2 | blue | 
| 3 | yellow | 
| 4 | green | 
+------+---------+ 

表:水果

+--------+----------+ 
| name | color_id | 
+--------+----------+ 
| apple | 1  | 
| banana | 3  | 
| grape | 4  | 
| lemon | 3  | 
+--------+----------+ 

所以我需要列出所有颜色,并在果表发生,返回像这样:

1, red, 1 
2, blue, 0 
3, yellow, 2 
4, green, 1 

我试图与此查询:

SELECT `c`.`id`, `c`.`name`, COUNT(1) 
FROM color `c` 
LEFT JOIN fruit `f` 
ON `c`.`id` = `f`.`color_id` 
GROUP BY `c`.`id` 

此查询为“蓝色”,而不是返回的计数。怎么一回事,因为颜色“蓝色”没有出现在果表

+1

不计(1)始终返回1? – Jerry

+1

那么,你正在计算1的数量,而mysql会这么做。用'count(f.name)'替换'count(1)',然后它会计算水果的数量。 – Solarflare

+0

@Jerry否,'COUNT(任何)'计数遇到的非空值的数量。 – Uueerdo

回答

4

这工作:

SELECT c.id, COUNT(f.name) 
FROM color c 
LEFT JOIN fruit f ON c.id = f.color_id 
GROUP BY c.id 

你要算水果的领域,使NULL可以返回,这变成了零。

1

你把计数(1),变化计数(f.color_id)

select 
    c.id 
    , c.name 
    , count(f.color_id) as [Color Count] 
from color as c 
    left join fruit as f 
    on c.id = f.color_id 
group by c.id, c.name