我正在努力寻找解决方案。我有以这种形式插入数据库的标签
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,然后使用数组中的第一个标签进行搜索,但这不是很好。
有谁知道有效的搜索方法?
答案 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变量即可。