2010-08-26 84 views
3

我有一個表articles,另一tags,第三個被稱爲article_tags。我想製作一個列出特定標籤的所有文章的頁面。獲取所有文章與他們的標籤GROUP_CONCAT字段

我的查詢看起來是這樣的:

SELECT headline, GROUP_CONCAT(tags.tag_name) AS all_tags FROM articles
LEFT JOIN articles_tags ON articles.article_id = articles_tags.article_id
LEFT JOIN tags ON articles_tags.tag_id = tags.tag_id
WHERE tags.tag_name = 'japan'
GROUP BY articles.article_id

所有返回的文章只有japan作爲標記,即使有問題的文章有幾個標籤。

這顯然與WHERE條款有關,但我無法弄清楚如何在這裏做我想做的事情 - 理想情況下,我最終會得到一個像japan,china,korea這樣的列表。這是子查詢的地方嗎?可以做一個SQL大師建議。

謝謝, 馬特

+0

在您的查詢中,您引用了tags表中的三個不同列:'tags.tag_id','tags.tag_name'和'tag ='japan''。這是一個錯誤嗎?你可以發佈你的表格定義來幫助澄清這一點嗎? – 2010-08-26 20:24:31

+0

Hi Mark - 是的,oops - 'tag ='japan'應該讀爲'tag_name ='japan' - 爲了這個例子我簡化了表格定義。我只是在下面嘗試你的代碼,所以看看這個空間。 – 2010-08-26 20:26:37

回答

3

有可以使用至少兩種方法。一種方法是兩次加入表格。另一個你指出的是使用子查詢。爲了簡單易讀,我可能會在這裏與子查詢一起。生成的查詢會是這個樣子:

SELECT 
    headline, 
    GROUP_CONCAT(tags.tag_name) AS all_tags 
FROM articles 
JOIN articles_tags ON articles.article_id = articles_tags.article_id 
JOIN tags ON articles_tags.tag_id = tags.tag_id 
WHERE articles.article_id IN (
    SELECT articles.article_id 
    FROM articles 
    JOIN articles_tags ON articles.article_id = articles_tags.article_id 
    JOIN tags ON articles_tags.tag_id = tags.tag_id 
    WHERE tags.tag_name = 'japan' 
) 
GROUP BY articles.article_id 

而這裏的使用方法更聯接:

SELECT 
    a.headline, 
    GROUP_CONCAT(t2.tag_name) AS all_tags 
FROM articles a 
JOIN articles_tags at1 ON a.article_id = at1.article_id 
JOIN tags t1 ON at1.tag_id = t1.tag_id AND t1.tag_name = 'tag1' 
JOIN articles_tags at2 ON a.article_id = at2.article_id 
JOIN tags t2 ON at2.tag_id = t2.tag_id 
GROUP BY a.article_id; 
+0

這個工程,謝謝 - 但它花了一分鐘跑!嗯。可能需要一些更好的索引... – 2010-08-26 20:28:29

+0

@Matt安德魯斯:是的,這肯定需要索引,否則子查詢將運行多次。您也可以嘗試使用連接的方法。 – 2010-08-26 20:33:43

+0

@Matt Andrews:我已經更新了我的答案,包括使用連接的方法。 – 2010-08-26 20:42:34

2

使用EXISTS:

SELECT a.headline, 
      GROUP_CONCAT(t.tag_name) AS all_tags 
    FROM ARTICLES a 
LEFT JOIN ARTICLES_TAGS at ON at.article_id = a.article_id 
LEFT JOIN TAGS t ON t.tag_id = at.tag_id 
    WHERE EXISTS(SELECT NULL 
        FROM ARTICLES x 
        JOIN ARTICLE_TAGS y ON y.article_id = x.article_id 
        JOIN TAGS z ON z.tag_id = y.tag_id 
           AND z.tag_name = 'japan' 
        WHERE x.article_id = a.article_id) 
GROUP BY a.article_id 

無需使用LEFT在子查詢的JOIN如果您只對與「japan」標籤相關的內容感興趣。

+0

我在'on clause'中得到了「Unknown column'x.tag_id'」查詢。 – 2010-08-26 20:40:17

+0

@Mark Byers:Thx,已更正。 – 2010-08-26 20:43:42

+0

即使在更新幾個外鍵和索引後,這也會更快(0.2秒)。儘管試圖馬克的其他建議。 – 2010-08-26 20:47:00

相關問題