我有一个电影数据库,其中一个表是“类别”,其中包含数据库中电影可能具有的所有类型。
运行以下查询:
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;
它返回这个表,缺少一些行(我希望它给出所有类型,而不仅仅是 Actor 扮演的角色):
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”,但没有为“ child ”或“喜剧”行,这是我正在寻找的结果(返回所有类型)。我做错了什么?
最佳答案
COUNT()
不计算 NULL,并且您的左连接会将 NULL 放入右侧表中没有值的记录中。您的外部联接实际上(或应该 - 检查这一点)返回所有所需的行,但带有聚合函数的外部选择正在吞噬它们。
尝试将 count()
移至右侧子查询中,然后在外部查询中将其替换为 IFNULL(q2.count, '0')
以将 NULL 替换为零。
我会注意到,您应该根据 q1.name 进行分组,而不是 q2.name。
关于mysql - 左连接不返回左表中的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33579310/