作为参考,我正在制作Sakila租赁DVD数据库概述here(#2):
基本上,我试图查询列出每个演员及他们所在的科幻电影的总运行时间。他们应该在表中总运行时间为NULL或0如果他们'从来没有进过科幻电影。
我能够弄清楚如何获得一份科幻片中的演员名单,但我不知道我哪里出错了以排除任何没有参加过科幻电影的演员
SELECT act.first_name, act.last_name, SUM(fm.length)
FROM film fm
INNER JOIN film_actor fa ON fa.film_id = fm.film_id
INNER JOIN actor act ON fa.actor_id = act.actor_id
INNER JOIN film_category fc ON fm.film_id = fc.film_id
INNER JOIN category cat ON fc.category_id = cat.category_id AND cat.name = 'Sci-Fi'
GROUP BY act.first_name, act.last_name
ORDER BY act.last_name ASC
我已经尝试更改为LEFT JOIN来获取演员(前两个连接)的两行,因为我认为这可能会解决演员没有电影不被包括的问题,但我最终得到了相同的结果。< / p>
答案 0 :(得分:0)
在执行左腰之前按类别聚合的子查询怎么样:
SELECT
act.first_name,
act.last_name,
cat_aggregate.sum_length
FROM
actor act
LEFT JOIN (
SELECT
cat.name,
fa.actor_id,
SUM(fm.length) sum_length
FROM
film fm
INNER JOIN film_actor fa ON fa.film_id = fm.film_id
INNER JOIN film_category fc ON fc.film_id = fm.film_id
INNER JOIN category cat ON cat.category_id = fc.category_id
GROUP BY
cat.name,
fa.actor_id
) cat_aggregate ON cat_aggregate.actor_id = act.actor_id
WHERE
cat_aggregate.cat_name = 'Sci-Fi'
ORDER BY
act.last_name,
act.first_name
在科幻电影中没有出现的演员将显示sum_length为NULL
。
如果您愿意,可以将WHERE cat_aggregate.cat_name = 'Sci-Fi'
移动到子查询中WHERE cat.name = 'Sci-Fi'
。