Left Join不返回左表中的所有行

时间:2015-11-07 05:02:25

标签: mysql

我有一个电影数据库,其中一个表是“类别”,它包含数据库中电影可能具有的所有类型。

运行以下查询:

SELECT category.name FROM category 

收回行:

Action
Animation
Children
Classics
Comedy
Documentary
Drama
Family
Foreign
Games
Horror
Music
New
Sci-Fi
Sports
Travel

我正在尝试查询数据库以找到特定actor扮演角色的每个特定类型的#,但是我希望它在下一列中返回带有#的所有类型。这是我最初的疑问:

SELECT q1.name AS 'Film Category', COUNT(q2.name) AS '# of Films Ed Chase has appeared in' 
FROM (
    SELECT category.name FROM category 
) AS q1
LEFT JOIN (
    SELECT category.name FROM category 
    INNER JOIN film_category ON film_category.category_id = category.category_id
    INNER JOIN film ON film.film_id = film_category.film_id
    INNER JOIN film_actor ON film.film_id = film_actor.film_id
    INNER JOIN actor ON actor.actor_id = film_actor.actor_id
    WHERE actor.first_name = 'ED' AND actor.last_name = 'CHASE'
) AS q2
ON q1.name = q2.name AND '# of Films Ed Chase has starred in' >= 0
GROUP BY q2.name
ORDER BY q2.name;

然后它返回这个表,缺少一些行(我希望它能给出所有类型,而不仅仅是演员扮演角色的那个):

Film Category   # of Films Ed Chase has appeared in
Animation       0
Action          2
Classics        2
Documentary     6
Drama           3
Foreign         2
Music           1
New             2
Sci-Fi          1
Sports          2
Travel          1

有趣的是,它为'动画'返回'0',但没有'儿童'或'喜剧'的行,这是我正在寻找的结果(所有类型都返回)。我做错了什么?

1 个答案:

答案 0 :(得分:1)

COUNT()不会计算NULL,而您的左连接会在记录中将NULL放在右侧表中没有值的位置。你的外连接实际上是(或者应该 - 检查这个)返回所有想要的行,但是带有聚合函数的外部选择正在吃它们。

尝试将count()移动到右侧子查询中,然后在外部查询中将其替换为IFNULL(q2.count, '0')以将零替换为零。

我会注意到你应该在q1.name上分组,而不是q2.name。