2012-03-21 71 views
2

我有一个自定义工作博客。一切工作正常我只是想知道如果有人知道更好的方式来从MySQL数据库选择包含标签的文章。按标签选择博客文章

当前标签存储在“blog”表中的“blog_tags”下,并且文章使用LIKE'%tag%'进行了重新划分。我工作得很好,直到我有2个包含相同单词的标签,例如网站和网站设计。

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

要解决每个标签的我加了“*”开头的解决方案,最终使blog_tags现在看起来像*标签1 *,*标签2 *,*标签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 

预先感谢!

回答

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' 

当然,如果你事先知道的标签识别,你就不需要加入上标签。

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

3

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

这是标准many to many relationship

创建一个表“标签”和一个关联表,其中两列都是外键(标签ID和博客条目ID)。

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