所以,我是PHP和数据库的新手,我在这里遇到了一个问题:
我有一个名为news
的表,其中一个列是tags
。此列包含一个或多个由空格分隔的标记,例如economics politics sports
。我有一个页面,它将接收一个或多个标签作为单个参数,我必须返回包含至少一个此标签的所有行。
我可以爆炸标签并根据需要进行尽可能多的数据库访问,但我确定这不是这样做的方式= p
LIKE
和IN
无效,因为参数可能按任何顺序包含多个标记。
任何帮助?
答案 0 :(得分:3)
这不是如何构建的。
有一个名为news的表,一个名为tags的表,还有一个名为tagsToNews的表。
在tagsToNews中只记录新闻项ID和标签ID,然后进行连接以获得所需内容。这也意味着可以重命名标签而不会破坏所有内容!
答案 1 :(得分:2)
最简单的解决方案
将表转换为MyISAM表,并使用FULLTEXT索引索引tags
。从那里,使用MATCH()
函数根据查询字符串(可能包含多个单词)提取行的匹配值
更具适应性的解决方案
删除该表并重新创建每行一个标记。您将以这种方式有效地实现FULLTEXT数组,因为它正是它的本质。如果您计划将数据爆炸,请避免将数据存储在长字符串中 - 通常,存储原子部分通常效率更高,因为您不必依赖饥饿的LIKE运算符。