2011-12-23 44 views
2

我需要一種有效的方法來選擇至少具有標籤「Tag1」和「Tag2」的所有文章。 這是非標準的方式有以下數據庫模式:使用MySQL中的一組標籤獲取所有文章的有效方法

articles(id, title) 
article_tag(articleid, tagid) 
tag(id, name) 

SELECT a.* 
FROM article a 
    INNER JOIN (SELECT at.articleid 
       FROM  article_tag at 
         INNER JOIN article a 
          ON a.id = at.articleid 
         INNER JOIN tag t 
          ON t.id = at.tagid 
       WHERE t.name IN ("Tag1","Tag2") 
       GROUP BY at.articleid 
       HAVING Count(at.articleid) = 2) aa 
    ON a.id = aa.articleid 

有沒有一種更有效的方式表現明智?

+0

您對標籤的最大數量有任何限制嗎? – 2011-12-23 21:28:29

+0

不,沒有最大限制,但最小值爲兩個標籤 – evodevo 2011-12-23 21:37:20

+0

您可以在子查詢中刪除與文章表的連接。 – DavidEG 2011-12-23 21:47:17

回答

3

我希望這個查詢要快(根據您的情況):

SELECT a.* 
FROM (
    SELECT at.articleid AS id 
    FROM article_tag at 
    JOIN tag t ON t.id = at.tagid 
    WHERE t.name = 'Tag1' 
    ) a1 
JOIN (
    SELECT at.articleid AS id 
    FROM article_tag at 
    JOIN tag t ON t.id = at.tagid 
    WHERE t.name = 'Tag2' 
    ) a2 USING (id) 
JOIN article a USING (id); 

然而,最重要的這裏部分是指標。主鍵會自動建立索引(我認爲):

  • 上(ID)
  • article_tag上(條款ArticleID,標籤識別)的文章 - 多列索引
  • 標籤上(ID)

此外,這些將幫助你的情況:

  • 上(名稱)
  • 藝術標籤(tagid)上的icle_tag

這是關係分區的特殊情況。這是一個extensive coverage of your case exactly。你會對有多少好方法感到驚訝。

相關問題