2014-03-04 31 views
-1

我有一個電影數據庫,其中一個表格用於演員,另一個用於電影,我創建了第三個表格以在電影中添加演員partecipation。我添加了一個領域「明星」來區分不是主要演員的主要演員。 我希望根據演員的重要性和「星星」總數創建一個列表順序。由第三個表中的在線訂購表

SELECT a.id, a.name, COUNT(p.star) AS star 
FROM actors a 
JOIN playing p, movies m 
WHERE p.id_actor = a.id 
AND p.id_movie = m.id 
AND p.star =1 
GROUP BY p.star 
ORDER BY p.star DESC; 

ACTORS

+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | actor01 | 
| 2 | actor02 | 
| 3 | actor03 | 
+----+---------+ 

MOVIES

+----+----------+ 
| id | title | 
+----+----------+ 
| 1 | movie01 | 
| 2 | movie02 | 
| 3 | movie03 | 
+----+----------+ 

PLAYING

+----------+----------+-------+------+ 
| id_movie | id_actor | char | star | 
+----------+----------+-------+------+ 
|  1 |  1 | char1 | 0 | 
|  1 |  2 | char2 | 1 | 
|  2 |  3 | char3 | 1 | 
+----------+----------+-------+------+ 

我需要輸出一樣:

+----------+--------------+ 
| actor | protagonist | 
+----------+--------------+ 
| actor01 | 2 times | 
| actor02 | 3 times | 
+----------+--------------+ 
+0

請加您的預期輸出 –

+1

不要混合隱式(逗號)連接和顯式J OIN語法。事實上,根本不要使用逗號加入 - 至少在你真的知道你在做什麼之前。 – Strawberry

+0

@Strawberry即使你知道你在做什麼 – Bohemian

回答

2

需要由演員不是明星列修復group by子句組。您需要通過聚合列,而不是原始列修復order by到組:

SELECT a.id, a.name, sum(p.star = 1) AS stars 
FROM actors a join playing p 
    on p.id_actor = a.id join 
    movies m 
    on p.id_movie = m.id 
GROUP BY a.id, a.name 
ORDER BY stars DESC; 

一路上,我固定from所以它使用正確的語法join(與on條款)。並更改了查詢,以便返回所有演員,即使是那些從未成爲明星的演員。

+0

你是不錯的戈登 - 沒有擺脫這種情況。 – Strawberry

+0

謝謝。這就是我想要的! – WalterV

1

1.如果你想爲一個演員計算所有星星,你應該按演員分組,但不要星星(除非你想要統計一個演員在電影中獲得1星的次數,你可能不想分組由星)

2.You可能要使用ONJOIN

3.You可能要ORDER BY star但不ORDER BY p.star因爲你想的結果訂購。

4.You可能要使用SUM,而不是COUNT獲得星數。(SUM計算值,但COUNT計算的數量,隨着SUM,您可以設置明星價值,無論你想不改變你的SQL你。可以有星= 2這說明演員是電影的重要或有明星= -1,這意味着演員太臭)

你可以看看下面的SQL:

SELECT a.id, a.name, SUM(p.star) AS sum 
FROM actors a 
LEFT JOIN playing p ON p.id_actor = a.id 
LEFT JOIN movies m ON p.id_movie = m.id 
GROUP BY a.id 
ORDER BY sum DESC;