0

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

我想将标签作为逗号分隔的单词字符串(非空白字符串)存储在数据库中。但我不太确定如何搜索包含标签 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 语句,您可以在其中搜索子字符串,但是您可以将它与多个子字符串一起使用吗?

4

2 回答 2

1

您无法以有意义的方式索引 csv 值的字段,并且 SQL 不支持能够在 CSV 值的字段中找到唯一值。相反,您需要再设置两个表,并对表进行以下更改。

博文:

编号 | 标题 | content_html

标签:

编号 | 标签名

分类表:

编号 | 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-09T01:39:41.323 回答
0

如果您真的想像这样存储数据,那么FIND_IN_SETmysql 函数将是您的朋友。

在 where 子句中有两次函数。

但它会表现得很糟糕 - 像已经建议的那样拥有一个链接表的一对多样式是更好的主意。如果您有许多相同的标签,则可以使用多对多。通过“post2tag”表。

于 2013-11-09T01:44:12.670 回答