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

  • 每篇文章都将具有“标签”字段,并且标签的格式为:“tag1,tag2,tag3”
  • 创建其他名为tag的表,其中包含以下字段: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个“最常用标签”的最佳方法是什么?

    最佳答案

    通常,对于这种多对多关系,有三个表:

  • article”表
  • 主键= id
  • tag”表
  • 主键= 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/

    10-11 04:40
    查看更多