Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql,PHP,搜索多个单词_Php_Mysql_Search - Fatal编程技术网

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 .= '")';