2015-07-11 53 views
0

我有几个包含电影,演员和类别数据的相关表格。我试图将每部演员的电影长度总结在一个特定的类别中。SQL:选择一个子查询的总和

这就是我要尝试,包括一个类别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列只包含所有空值。

此查询的工作,但不包括谁有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 
+0

尝试改变你的使用语句到左连接,这就是为什么它不会包括与0连接。只是说明“连接”是内部连接。 – Reisclef

回答

0

这里就是我得到了到我需要的:

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 
0

你需要一个外部联接和标准:

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 
0

在第一个查询您要添加的所有类别的长度,无论演员的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 
+0

现在我在总结列中获得值,但他们看起来不正确。我知道至少30名演员在类别14中有0分钟,但所有结果都显示为1000+分钟。 – Josh

+0

在第一个查询中,您将所有类别14电影的长度加起来,无论演员是谁, – symcbean

+0

对,我更新了我的代码来匹配你的,但总数异常高,并且都不是0. – Josh