0

我的数据库中有一个带有文章名称和文章标签的文章表。文章标签是一个字符串列,其中包含如下标签:“人物、生活、总统”​​。每篇文章都以这种方式标记。

现在我想为所有文章获取 10 个最受欢迎的标签。这个怎么做?

4

2 回答 2

8

如果有可能,最好将数据库架构更改为具有 article 表、tag 表和 article_tags 表。

这将允许更有效地匹配标签(如您想要做的那些),特别是如果您有很多文章。

使用您当前的设计,您必须完全迭代(可能很大)articles 表,并维护一堆标签(通过临时表 - 在这种情况下,您可以通过存储过程来完成 - 或在应用程序代码中) )。整体效率真的很低。

于 2009-12-05T16:49:05.720 回答
1

如果您对数据库进行规范化并创建一个单独的标签表,那将会容易得多。例如,如果您有这样的数据库:

article
    article_id
    article_title
    article_content

article_tag
    tag_name
    article_id
    UNIQUE INDEX (tag_name, article_id)
    UNIQUE INDEX (article_id, tag_name) # in order to perform fast lookups in both directions

tag(这可以通过创建一个包含 thetag_name和 a的 -tabletag_id并替换tag_nametag_idin来进一步规范化article_tag。)

现在,您可以使用以下查询显示最受欢迎的标签列表:

SELECT tag_name, count(article_id) c 
  FROM article_tag
  GROUP BY tag_name
  ORDER BY c DESC
  LIMIT 10
于 2009-12-05T16:51:43.677 回答