Sakila db SQL为每个演员找到科幻电影的总电影长度

时间:2014-08-04 03:12:41

标签: sql

作为参考,我正在制作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>

1 个答案:

答案 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'