2012-11-18 168 views
2

引擎,所以,我在PHP和数据库的新,我这里有一个问题:搜索按标签

我有一个表叫news和其列之一是tags。此列包含1个或多个由空格分隔的标记,如economics politics sports。并且我有一个页面将接收一个或多个标记作为单个参数,并且必须返回至少包含一个此标记的所有行。

我可能爆炸的标签,并根据需要做尽可能多的数据库访问,但我敢肯定,这不是做= P

LIKEIN将无法​​工作或者是因为paramater可以包含更多的方式以任何顺序超过1个标签。

任何帮助?

回答

3

这不是如何构造。

有一个叫做news的表,一个叫tags,一个叫tagsToNews。

在tagsToNews中只记录新闻条目ID和标签ID,然后进行连接以获取所需内容。这也意味着标签可以重新命名而不会破坏一切!

+0

嗯,这似乎是一个解决方案,谢谢=)。只是另一个问题: 我有一个页面来插入新闻。有没有办法将其插入并将其映射到相同查询中的标签?更多:如果标签不存在,创建标签? –

+1

不在一个查询中,但您始终可以对其使用INSERT TRIGGER。 –

+0

大多数人在两次查询(或者很多次)中都这样做,但使用触发器更加健壮。 –

2

最简单的解决

使用FULLTEXT索引转换表中,以MyISAM表和索引的tags。从那里,使用MATCH()函数提取一个匹配值针对查询字符串的行(其可包含多个字)

更多适应性溶液

删除该表和与每行一个标签重新创建它。您将以这种方式有效地实现FULLTEXT数组,因为它就是这样。如果您计划将数据爆炸,请避免将数据存储在长字符串中 - 通常,存储原子部分通常效率更高,因为您不必依赖饥饿的LIKE运算符。

+0

感谢的人,似乎会解决=) –