PHP / MySQL博客系统

时间:2013-11-09 01:26:10

标签: php mysql

我正在建立一个博客系统,我想在我的博客帖子中添加“标签”。这些与您在此处看到的标签类似,可用于对具有相似主题的帖子进行分组。

我想将标记存储在数据库中,作为逗号分隔的单词字符串(非空白字符串)。但我不太确定如何搜索包含标签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! :&gt;"            | "hello,tag3,you"

如何在标签中选择包含"hello"以及"world"的所有帖子?我知道LIKE语句,您可以在其中搜索子字符串,但是您可以将它与多个子字符串一起使用吗?

2 个答案:

答案 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'表。