我有一个电影数据库,其中一个表是“类别”,它包含数据库中电影可能具有的所有类型。
运行以下查询:
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',但没有'儿童'或'喜剧'的行,这是我正在寻找的结果(所有类型都返回)。我做错了什么?
答案 0 :(得分:1)
COUNT()
不会计算NULL,而您的左连接会在记录中将NULL放在右侧表中没有值的位置。你的外连接实际上是(或者应该 - 检查这个)返回所有想要的行,但是带有聚合函数的外部选择正在吃它们。
尝试将count()
移动到右侧子查询中,然后在外部查询中将其替换为IFNULL(q2.count, '0')
以将零替换为零。
我会注意到你应该在q1.name上分组,而不是q2.name。