Mysql,PHP,搜索多个单词
我正试图在表格中搜索特定的单词 假设我有一个单词列表:打印机、网络、无线、紧急 我只想返回所有这些单词所在的行Mysql,PHP,搜索多个单词,php,mysql,search,Php,Mysql,Search,我正试图在表格中搜索特定的单词 假设我有一个单词列表:打印机、网络、无线、紧急 我只想返回所有这些单词所在的行 SELECT * FROM tickets WHERE concat(subject,body) REGEXP "printer|network|wireless|urgent" 将返回包含这些单词中任何一个的任何行。如何使它只返回所有这些单词所在的行 SELECT * FROM tickets WHERE concat(subject,body) REGEXP "printer|
SELECT * FROM tickets WHERE concat(subject,body) REGEXP "printer|network|wireless|urgent"
将返回包含这些单词中任何一个的任何行。如何使它只返回所有这些单词所在的行
SELECT * FROM tickets WHERE concat(subject,body) REGEXP "printer|network|wireless|urgent"
谢谢,这不是最好的方式,但是:
SELECT * FROM tickets WHERE
concat(subject,body) REGEXP "printer" AND
concat(subject,body) REGEXP "network" AND
concat(subject,body) REGEXP "wireless" AND
concat(subject,body) REGEXP "urgent"
不确定这是否适用于MySQL正则表达式引擎,但下面的正则表达式(使用lookarounds)可以实现您想要的。将查找感兴趣的词语,而不考虑其出现的顺序:
^(?=.*printer)(?=.*network)(?=.*wireless)(?=.*urgent).*$
演示:
这里有一些regex环顾四周的例子:备选答案,只是因为我在看你的问题时想到了它。我不知道它是否会比其他答案更快(很可能是否定的): 更新:
这是错误的有两种方法可以做到这一点。第一个是相当明显的方法。假设您拥有所有需要显示在名为$necessaryWords的数组中的单词:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
但是,使用%foo%
速度相当慢,因为无法使用索引,因此此查询可能会导致大型表和/或大量必需的字的性能问题
另一种方法是在主题
和正文
上建立全文
索引。您可以在布尔模式下使用全文匹配,如下所示:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
请注意,您的表必须使用MyISAM
才能使用全文索引。更新:,InnoDB
还支持全文索引。我想这可能是性能方面更好的选择。关于布尔模式下全文的更多文档可以在中找到。是必须显示为固定或可变的字数?最好是一个变量。您可以像“%word1%”和“%word2%”这样执行,尽管性能不会很好。如果您一般地实现关键字搜索,您可能希望研究文本索引基系统,例如Zend Lucene(基于PHP,如果您不介意使用其他语言,还有其他系统)。这将返回包含这两个单词中任何一个的所有行。@DobotJr:出于好奇和将来可能访问此页面:您选择了哪个版本,为什么?
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';