按标签选择博客文章

时间:2012-03-21 14:05:41

标签: php mysql

我有一个自定义工作博客。一切正常我只是想知道是否有人知道从mysql数据库中选择包含标签的文章的更好方法。

目前,标签存储在“博客”表中的“blog_tags”下,并且使用LIKE'%tag%'对文章进行了后续处理。我工作正常,直到我有2个包含相同单词的标签,例如网站和网站设计。

使用上述方法搜索网站等标签,我会得到包含网站标签和网站设计的结果。

要修复解决方案,我在每个标记的开头和结尾添加了“*”,以便blog_tags现在看起来像* tag 1 *,* tag 2 *,* tag 3 *,*依此类推......

现在我只是搜索blog_tags的文章,例如'%* tag here *%'。这很好用,但可能有更好的方法。有什么想法吗?

目前使用的查询是:

"SELECT * FROM `blog` WHERE `active` = 'y' AND `blog_tags` LIKE '%*" . str_replace("-", " ", $tag) . "*%' ORDER BY `blog_created` DESC LIMIT " . $startfrom . "," . $limit

提前感谢!

2 个答案:

答案 0 :(得分:3)

您有一个关系数据库。它旨在存储结构化数据。不要发明自己的结构,然后将它们存储在字段中。

这是标准many to many relationship

创建一个表“tags”和一个包含两列的关联表,这两列都是外键(标记ID和博客条目ID)。

然后使用JOIN获取您关注的条目。

答案 1 :(得分:1)

您不应该在数据库中拥有多值字段。举个例子,您的博客似乎有许多与许多博客相对应的标签和标签。这是一种多对多的关系。

根据经验,多对多关系会生成一个新表。因此,您应该使用的数据库模式类似于:

Blogs(*Id*, activ, date_created)
Tags(*Id*, text)
Blog_Tag(*BlogId*, *TagId*)

主键显示在星号之间。

所以,如果你想搜索所有标记为'mysql'的博客,你会做类似的事情:

select * from blogs b
join blog_tag bt on b.id = bt.blogid
join tags t on bt.tagid = t.id
where t.text = 'mysql'

当然,如果您事先知道TagId,则不需要加入标签。

希望这已经消除了一些疑虑。