2012-09-10 29 views
0

我有三張關係很多的表格。表格很簡單:電影,標籤和電影標籤(下面的定義)。我希望用戶能夠看到最受歡迎的標籤。這裏的工作查詢:從多人到多人的關係中選擇人氣排序的標籤

SELECT tags.tag, COUNT(*) AS c, tags.id 
FROM tags 
LEFT JOIN movietags ON tags.id = tagid 
GROUP BY tags.id 
ORDER BY c DESC 

所以結果是像(標籤名稱,計數,tags.id)

action 450 2 
comedy 300 10 
drama 280 8 
thriller 250 5 
etc. 

很多電影都分配許多標籤。我希望用戶能夠選擇他們最喜歡的標籤。例如,如果用戶從上面的列表中選擇「動作」,應該在具有「動作」標籤的電影中獲得最受歡迎的標籤。其結果將是類似下面 - 電影只能用「動作」標籤:

comedy 120 10 
thriller 88 5 
western 62 21 
drama  41 8 

現在我適應不了我上面的查詢,有WHERE沒有錯誤條款。我怎樣才能選擇和計算電影只有「行動」類別?另外,我希望用戶從更多標籤中進行選擇,例如選擇帶有「動作」,「驚悚片」和「喜劇」標籤的電影,這些標籤也通過帶有這些標籤的電影數量排序。

表的定義:

CREATE TABLE `movie` (
    `id` int(10) unsigned, 
    `title` varchar(250), 
    `tags` varchar(250), 
    `category` varchar(250), 
    KEY `id` (`id`) 
) ENGINE=MyISAM; 


CREATE TABLE `movietags` (
    `tagid` int(10) unsigned, 
    `movieid` int(10) unsigned, 
    UNIQUE KEY `tagid_2` (`tagid`,`movieid`), 
    KEY `mainid` (`movieid`), 
    KEY `tagid` (`tagid`) 
) ENGINE=MyISAM; 

CREATE TABLE `tags` (
    `id` int(10) unsigned auto_increment, 
    `tag` varchar(250), 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `tag` (`tag`) 
) ENGINE=MyISAM; 
+0

你什麼錯誤? –

+0

#1064 - 您的SQL語法錯誤;查詢對應於您的MySQL服務器版本的手冊,以找到在WHERE tags.id = 5 附近使用的正確語法。查詢是:SELECT tags.tag,COUNT(*)AS c,tags.id FROM tags LEFT JOIN movietags ON tags.id =標籤識別 GROUP BY tags.id ORDER用C DESC WHERE tags.id = 5 – Tonyo2k

回答

1

至於你的語法錯誤,WHERE那張GROUP BY之前:

SELECT tags.tag, COUNT(*) AS c, tags.id 
FROM tags 
LEFT JOIN movietags ON tags.id = tagid 
WHERE tags.id =5 
GROUP BY tags.id 
ORDER BY c DESC 
+0

爲了讓人們選擇多個標籤,使用: WHERE tags.id在(5,6,7 ,8)。 IN子句很難參數化。 –

+0

謝謝,現在沒有錯誤! – Tonyo2k

+0

謝謝,現在沒有語法錯誤!但是我現在得到的結果只有一行,帶有這個標籤ID,並計算出有它的電影。如果我使用WHERE ... IN,我只獲得具有指定ID的條目,因此是初始查詢的一部分,這對我而言是合乎邏輯的。我想得到的是其他標籤中包含這些標籤的電影列表。 – Tonyo2k

相關問題