我正在建立一个博客系统,我想在我的博客帖子中添加“标签”。这些与您在此处看到的标签类似,可用于对具有相似主题的帖子进行分组。
我想将标记存储在数据库中,作为逗号分隔的单词字符串(非空白字符串)。但我不太确定如何搜索包含标签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语句,您可以在其中搜索子字符串,但是您可以将它与多个子字符串一起使用吗?
答案 0 :(得分:1)
您无法以有意义的方式索引csv值字段,并且SQL不支持能够在CSV值字段中查找唯一值。相反,您需要再设置两个表,并对表进行以下更改。
的相关博客文章:
id |标题| 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;
// UPDATE
在构建应用程序期间,设置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”标签的博客帖子。
干杯
答案 1 :(得分:0)
如果你真的想存储这样的数据,那么FIND_IN_SET
mysql函数就是你的朋友。
在where子句中使用该函数两次。
但是它会表现得非常糟糕 - 如已经建议的那样,使用链接表一对多的风格是更好的主意。如果你有很多相同的标签,可以使用多对多。通过'post2tag'表。