【问题标题】:Efficient way to get all articles with a set of tags in MySQL在 MySQL 中获取所有带有一组标签的文章的有效方法
【发布时间】:2012-01-27 02:07:29
【问题描述】:

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

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

【问题讨论】:

  • 标签的最大数量有限制吗?
  • 不,没有最大限制,但最少是两个标签
  • 您可以在子查询中删除与文章表的联接。
  • 我添加了sql-match-all 标签。这种确切类型的问题已经在 SO 上回答了很多次。

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


【解决方案1】:

我希望这个查询更快(根据您的条件量身定制):

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。你会惊讶于有多少好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多