2017-03-04 63 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');