作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的网站上有文章,我想添加描述每篇文章的标签,但我在为标签设计 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 个“最常用标签”的最佳方法是什么?
最佳答案
一般这种多对多的关系,有3个表:
文章
”表
标签
”表
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/
我是一名优秀的程序员,十分优秀!