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
我有几个包含电影、演员和类别数据的相关表格。我正在尝试对每个演员的特定类别的电影长度求和。
这是我必须尝试在结果中包含类别 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