我的网站上有文章,我想添加描述每篇文章的标签,但是我在设计标签的mysql表时遇到了问题。我有两个想法:
因此,当我想要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
”表tag
”表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
基本上,您:
where
子句匹配的标签,而没有group by
子句,则该文章有两行group by article.id
时,每篇文章只有一行count
来找出每篇文章与最初的关于mysql - 如何为标签云设计MySql表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2602957/