在PHP / MySQL中使用标签进行搜索

时间:2011-09-05 19:46:55

标签: php mysql database tags

我正在努力寻找解决方案。我有以这种形式插入数据库的标签

mytags = firsttag, secondtag, thirdtag

在单页上,我需要根据这些标签显示相关项目,而不是我正在使用

SELECT * FROM posts WHERE tags LIKE \"%$mytags%\" ORDER BY views DESC LIMIT 5"

然而,这不起作用,因为它只搜索具有完全相同标语(posttag,secondtag,thirdtag)的帖子,而不搜索其标签包含其中一个标签(firsttag,anothertag和anothertag)的帖子。 / p>

我想过爆炸mytags,然后使用数组中的第一个标签进行搜索,但这不是很好。

有谁知道有效的搜索方法?

4 个答案:

答案 0 :(得分:2)

为什么不使用单独的表来保留帖子标签?我的意思是例如表'posts',表'tags'和关系表'posts_tags'。 这是“帖子”的结构:

id
title
content

以下是'tags'的结构:

id
tag_name

如果'posts_tags':

,这是结构
id
post_id
tag_id

这是“多对多”关系模式的方案。现在,您可以通过JOIN运算符简单地找到标签或/和帖子。

答案 1 :(得分:1)

这不是一个适当的方法。您的数据库未规范化。简而言之,不可能做你想做的事,即使是这样,也是无效的。

你必须创建另一个表 - 标签,然后另一个表示标签与帖子的连接,例如 TagsPosts ,一切都被正确编入索引。

答案 2 :(得分:1)

您可能希望查看find_in_set(),但我强烈建议您规范化数据库并使用正确的结构。

答案 3 :(得分:0)

您应该始终keep your data normalised(每列中的一个数据)。使用两个表可以解决这个问题;一个用于标签,一个用于帖子和MySQL LEFT JOIN。以下是一个非常小的例子。

posts

id  int(11) Auto Increment   
title   char(255)

tags

id  int(11)  
postid  int(11)  
tag char(64)

查询以搜索包含firstpost

标签的帖子

(重要)

SELECT p.title FROM posts p
LEFT JOIN tags t
ON t.postid=p.id
WHERE t.tag LIKE '%firstpost%'

样本数据

INSERT INTO `posts` (`id`, `title`) VALUES
(1, 'Post number 1'),
(2, 'Another post'),
(3, 'Third post');

INSERT INTO `tags` (`id`, `postid`, `tag`) VALUES
(0, 1,  'first_post'),
(0, 1,  'firstpost_secondtag'),
(0, 2,  'secondpost_firsttag');

正如我上面所说,这是一个非常小的例子。这里最重要的一点是使用LEFT JOIN和一个单独的标签表。您应该明白,只需将firstpost语句中的LIKE替换为PHP变量即可。