在MySQL中使用一组标签获取所有文章的有效方法

时间:2011-12-23 21:19:49

标签: mysql sql sql-match-all relational-division

我需要一种有效的方法来选择至少包含标签“Tag1”和“Tag2”的所有文章。 这是使用以下数据库模式的标准方法:

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

是否有更有效的表现方式?

1 个答案:

答案 0 :(得分: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 on(articleid,tagid) - 多列索引
  • 标签上(id)

此外,这些将有助于您的情况:

  • 标签上(姓名)
  • article_tag on(tagid)

这是关系划分的特例。这是一个extensive coverage of your case exactly。你会对有多少好方法感到惊讶。