我有一个自定义工作博客。一切正常我只是想知道是否有人知道从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
提前感谢!
答案 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,则不需要加入标签。
希望这已经消除了一些疑虑。