2013-02-27 212 views
-1

首先对不起的,我的英语...搜索php + mysql的关键词?

我对数据库中的标签字段,我正在寻找像

SELECT * FROM table WHERE tags LIKE '%$keyword%' and tags LIKE '%$keyword%' 

我单独由像空间标签;

america england france 

我想告诉你,比如我的表结构

id | title | tags 

1 title1 america france 
2 title2 american english 
3 title3 england french 

当我要搜索“美国”

结果TITLE1和标题2,因为美国美国标签看起来像是相同的 字..

我怎样才能让他们独一无二?当我搜索了美国,结果应该是唯一TITLE1 ...

感谢您的帮助,希望你能理解我的问题..有一个愉快的一天

编辑:

由于阿卡姆他写的解决方案

+1

你可以简单地使用'标签'关键字%''添加一个空格? – 2013-02-27 20:59:26

+1

谢谢你,他的工作..有一个愉快的一天 – OMahoooo 2013-02-27 21:11:33

+1

这是一个糟糕的表结构。你应该规范设计。每个标记都在其OWN记录中。 – 2013-02-27 21:26:37

回答

1

你可以使用这样的事情:

SELECT * 
FROM tbl 
WHERE CONCAT(' ', tags, ' ') LIKE CONCAT('% ', 'america', ' %') 

请参阅小提琴here

+0

,如果相关标签位于字段的开始或结尾,并且没有前导/尾随空格,则会失败。 – 2013-02-27 21:27:00

+0

@MarcB我在LIKE的两边添加了一个前导/尾随空格,我不认为它会失败 – fthiella 2013-02-27 21:29:58

0

你也可以使用MySQL的REGEXP来代替LIKE,使用字边界修饰符来匹配整个单词。您的查询会是这个样子:

SELECT * FROM table WHERE tags REGEXP '[[:<:]]$keyword[[:>:]]'; 

这有让额外的奖励,你寻找符合一组给定的在一个单一的查询标签的任何(或全部)如果你需要在该行:

SELECT * FROM table WHERE tags REGEXP '[[:<:]]$keyword_one[[:>:]]|[[:<:]]$keyword_two[[:>:]]' 

注意在正规表达式条件两个表达式之间的管道|字符,这意味着它会匹配符合这些标记中的至少一个的任何记录。

我没有亲自测试这种方法的性能,但在其他StackOverflow的帖子已阅读,它是非常相当于LIKE在开始时%通配符(因为这类型的查询将会导致MySQL的不使用索引)。所以我想这对你来说是最好的选择。

更多的信息在这里:http://dev.mysql.com/doc/refman/5.1/en/regexp.html