我正在制作一个博客系统,我想在我的博客文章中添加“标签”。这些类似于你在这里看到的标签,它们可以用来对主题相似的帖子进行分组。
我想将标签存储在数据库中,作为逗号分隔的字串(非空白字符串)。但我不太清楚如何搜索所有包含标签A和标签B的帖子。
我不喜欢使用小型数据库的简单解决方案,在这个解决方案中,我检索所有数据并使用PHP循环对其进行扫描,因为这不适用于大型数据库(即使不是数千篇,也有数百篇)。我不打算写这么多博客,但我希望系统是可靠的,通过直接从数据库中获得正确的结果来节省PHP脚本上的工作时间。
假设我的桌子看起来像这样(实际上它有点复杂)
blogposts:
id   | title         | content_html                  | tags
0    | "hello world" | "<em>hello world!</em>"       | "hello,world,tag0"
1    | "bye world"   | "<strong>bye world!</strong>" | "bye,world,tag1,tag2"
2    | "hello you"   | "hello you! :>"            | "hello,tag3,you"如何选择标签中包含"hello"和"world"的所有帖子?我知道LIKE语句,在那里您可以搜索子字符串,但是可以将它与多个子字符串一起使用吗?
发布于 2013-11-09 01:39:41
您不能以有意义的方式索引csv值字段,SQL也不支持在CSV值字段中找到唯一的值。相反,您需要再设置两个表,并对表进行以下更改。
博客:
id _ title _ content_html
标签:
id = tag_name
分类表:
id = blogpost_id \ tag_id
当向博客文章添加标记时,将向分类法表中插入新记录。当您查询数据时,您将连接所有三个表以获得类似于以下内容的信息:
SELECT `tag_name` FROM `blogposts` INNER JOIN `blogposts_taxonomy` ON
`blogposts`.`id`=`blogposts_taxonomy`.`blogpost_id` INNER JOIN `blogpost_tags` ON
`blogposts_taxonomy`.`tag_id`=`blogpost_tags`.`id` WHERE `blogposts`.`id` = someID;//更新
在应用程序的构建过程中,建立N:M关系会给你很多选择。例如,假设您希望能够搜索所有标记为“php”的博客文章。你可以这样做:
SELECT `id`,`html_content` FROM `blogposts` INNER JOIN `blogposts_taxonomy` ON
`blogposts`.`id`=`blogposts_taxonomy`.`blogpost_id` INNER JOIN `blogposts_tags` ON
`blogposts_taxonomy`.`tag_id`=`blogposts_tags`.`id` WHERE `blogposts_tags`.`tag_name`="php";这将返回所有被标记为"php“标签的博客。
干杯
发布于 2013-11-09 01:44:12
如果您真的想存储这样的数据,FIND_IN_SET mysql函数将是您的朋友。
在where子句中有两次函数。
但它将表现得可怕--有一个连接的桌子,一对多的风格,正如已经提出的是更好的想法。如果你有很多相同的标签,那么可以使用多到多的标签。通过'post2tag‘桌。
https://stackoverflow.com/questions/19871313
复制相似问题