2

我需要一种有效的方法来选择至少带有“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

有没有更有效的方式来提高性能?

4

1 回答 1

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)

这是关系划分的一个特例。这是对您的案例的广泛报道。你会惊讶于有多少好的方法。

于 2011-12-23T22:00:01.713 回答