2011-12-23 56 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。你会对有多少好方法感到惊讶。

相关问题