2017-03-04 86 views
0

我正在处理3个表格:actors,films和actor_film。演员和电影只有2个字段:id(主键)和名字。 Actor_film也有两个字段,演员和电影,这两个字段分别代表演员和电影ID。所以如果一部电影里面有4个演员,就会有4部actor_film条目和4部不同的演员。SELECT干扰COUNT中的SQLite

我的问题是,我想返回电影ID,电影名称和某个电影中演员的数量。但是,我不想把它放在整个桌子上,而只是希望它只适用于其中有某个演员的电影。

目前,当我查询是这样的:

SELECT af.film, f.name, COUNT(af.film) FROM film AS f, actor_film AS af WHERE af.actor = "/m/0f502" AND af.film = f.id GROUP BY af.film;

我越来越

/m/0f4_l|Pulp Fiction|1 /m/0zz10|Primary Colors|1

其中75%是正确的,但不是完整的故事。前两列是正确的,但我希望计数不仅仅是演员出现在电影中的次数(显然限制在1),但是这些电影中演员的总数(以actor_film计)表。

我认为这需要一个嵌套的SELECTINNER JOIN,但我是SQLite的新手,并不真正了解它是如何工作的。任何帮助和解释将得到彻底赞赏。

+0

你能不能改变COUNT(af.film)以计数(af.actor) –

+0

这奇怪的结果相同。 .. – willay

回答

0

您正在使用actor_film中的actor列基本上磨练您想要计算哪些电影。你的下一步应该是JOIN,结果回actor_film,这样你就可以抓取所有与该电影相关的actor_film记录。

我认为以下应做你找什么:

SELECT f.id, f.name, COUNT(af_2.actor) AS actor_count 
FROM actor_film af 
JOIN actor_film af_2 ON 
    af_2.film = af.film 
JOIN film f ON 
    f.id = af.film 
WHERE af.actor = "/m/0f502" 
GROUP BY af.film; 
2

其中浮现在脑海的最简单的选择是聚集在actor_film表和统计两件事情。首先,计算每部电影中演员的人数。同时,计算在该电影中出现感兴趣的演员的次数。如果我们想要的演员至少出现一次,电影将保留在此子查询中。然后,将此子查询加入film表中,以便导入电影的ID和名称。

SELECT f1.id, f1.name, f2.num_actors 
FROM film f1 
INNER JOIN 
(
    SELECT film, COUNT(*) AS num_actors 
    FROM actor_film 
    GROUP BY film 
    HAVING SUM(CASE WHEN actor = "/m/0f502" THEN 1 ELSE 0 END) > 0 
) f2 
    ON f1.id = f2.film 
+0

虽然演员数是正确的,但这会产生演员不在其中的电影。 – willay

+0

@willay我认为你的数据是什么问题。 –

+0

@willay对不起,我有'COUNT'而不是'SUM'。 –

0

这的确是可能的嵌套进行选择,即(correlated)subqueries

SELECT id, 
     name, 
     (SELECT count(*) 
     FROM actor_film 
     WHERE film = films.id 
     ) AS actors 
FROM films 
WHERE id IN (SELECT film 
      FROM actor_film 
      WHERE actor = '/m/0f502');