gpt4 book ai didi

mysql - 如何为标签云设计 MySql 表?

转载 作者:可可西里 更新时间:2023-11-01 06:31:39 25 4
gpt4 key购买 nike

我的网站上有文章,我想添加描述每篇文章的标签,但我在为标签设计 mysql 表时遇到了问题。我有两个想法:

  1. 每篇文章都有“tags”字段,标签的格式为:“tag1,tag2,tag3”
  2. 创建另一个名为 tags 的表,字段为:tag_name、article_id

所以当我想要 ID 为 1 的文章的标签时,我会运行

SELECT ... FROM tags WHERE `article_id`=1;

但是,我还想通过比较标签来了解 3 篇最相似的文章,所以如果我有一篇文章的标签是“php、mysql、erlang”,还有 5 篇文章的标签是:“php、mysql”、“erlang, ruby”、“php erlang”、“mysql、erlang、javascript”,我会选择 1.、3. 和 4.,因为这 3 个与主要文章具有最相同的标签。

还有其他问题,获得 10 个“最常用标签”的最佳方法是什么?

最佳答案

一般这种多对多的关系,有3个表:

  • 文章”表
    • 主键=id
  • 标签”表
    • 主键=id
    • 包含每个标签的数据:
      • 姓名,例如
  • tags_articles”表,充当连接表,仅包含:
    • id_article : 指向文章的外键
    • id_tag : 指向标签的外键


这样,任何标签的数据都不会重复:对于每个标签,tag 表中只有一行。

并且,对于每篇文章,您可以有多个标签(即 tags_articles 表中的几行);当然,对于每个标签,您可以有几篇文章。

根据这个想法,获取文章的标签列表是一个额外的查询问题,例如:

select tag.*
from tag
inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123


获得三篇“最相似”的文章意味着:

  • 选择具有第一篇文章标签的文章
  • 只使用那些具有最多相同标签的标签

未经测试,但一个想法可能看起来像这样:

select article.id, count(*) as nb_identical_tags
from article
inner join tags_articles on tags_articles.id_article = article.id
inner join tag on tag.id = tags_articles.id_tag
where tag.name in ('php', 'mysql', 'erlang')
and article.id <> 123
group by article.id
order by count(*) desc
limit 3

基本上,你:

  • 为初始文章中出现的每个标签选择文章 ID
    • 因为有一个内部连接,如果数据库中的一篇文章有​​ 2 个标签匹配 where 子句,没有 group by 子句,会有两行那篇文章
    • 当然,您不想重新选择已有的文章——这意味着它必须被排除。
  • 但是,当您使用 group by article.id 时,每篇文章只有一行
    • 但是您将能够使用count,找出每篇文章与最初的文章有多少个标签
  • 然后,只需要按标签数量排序,并只获取第三个三行即可。

关于mysql - 如何为标签云设计 MySql 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2602957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com