我的数据库中有一个带有文章名称和文章标签的文章表。文章标签是一个字符串列,其中包含如下标签:“人物、生活、总统”。每篇文章都以这种方式标记。
现在我想为所有文章获取 10 个最受欢迎的标签。这个怎么做?
如果有可能,最好将数据库架构更改为具有 article 表、tag 表和 article_tags 表。
这将允许更有效地匹配标签(如您想要做的那些),特别是如果您有很多文章。
使用您当前的设计,您必须完全迭代(可能很大)articles 表,并维护一堆标签(通过临时表 - 在这种情况下,您可以通过存储过程来完成 - 或在应用程序代码中) )。整体效率真的很低。
如果您对数据库进行规范化并创建一个单独的标签表,那将会容易得多。例如,如果您有这样的数据库:
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_name
为tag_id
in来进一步规范化article_tag
。)
现在,您可以使用以下查询显示最受欢迎的标签列表:
SELECT tag_name, count(article_id) c
FROM article_tag
GROUP BY tag_name
ORDER BY c DESC
LIMIT 10