SQL: Select 一个子查询的总和

SQL: Select the sum of a subquery

我有几个包含电影、演员和类别数据的相关表格。我正在尝试对每个演员的特定类别的电影长度求和。

这是我必须尝试在结果中包含类别 ID 子查询总和的方法:

SELECT actor.actor_id, (SELECT SUM(length) from film WHERE category_id=14) total
FROM actor
JOIN film_actor USING(actor_id)
JOIN film USING(film_id)
JOIN film_category USING(film_id)
JOIN category USING(category_id)
GROUP BY actor.actor_id
ORDER BY total DESC

但是我的 total 列只包含所有 NULL 值。

此查询有效,但不包括该类别中电影时长为 0 分钟的演员:

SELECT actor.actor_id, SUM(film.length) as total
FROM actor
JOIN film_actor USING(actor_id)
JOIN film USING(film_id)
JOIN film_category USING(film_id)
JOIN category USING(category_id)
WHERE category_id = 14
GROUP BY actor.actor_id

您需要一个外连接并且类别的条件属于外连接的 on 子句:

select a.actor_id,
       sum(f.length) as total
  from actor a
  join film_actor fa
    on a.actor_id = fa.actor_id
  join film f
    on fa.film_id = f.film_id
  left join film_category fc
    on fc.film_id = f.film_id
   and fc.category_id = 14
 group by a.actor_id

在您的第一个查询中,您将所有类别 14 电影的长度加起来,而不考虑演员,因此您会看到每个演员的相同值。如果所有值都为空,那么您在类别 14 中没有电影。

我怀疑你想为每个演员添加 14 类电影的长度....

SELECT actor.actor_id, SUM(IFNULL(film.length, 0))
FROM actor 
JOIN film_actor USING(actor_id)
JOIN film USING(film_id)
LEFT JOIN film_category 
   ON film_category.film_id=film.film_id
   AND film_category.category_id=14
GROUP BY actor.actor_id

我是这样得到我需要的东西的:

SELECT actor.actor_id, SUM(film.length) as total
FROM actor
JOIN film_actor USING(actor_id)
LEFT JOIN film on film_actor.film_id = film.film_id AND film.film_id IN  (SELECT film_id FROM film_category WHERE film_category.category_id = 14)
GROUP BY actor.actor_id