繁体   English   中英

Mysql,PHP,搜索多个单词

[英]Mysql, PHP, searching for multiple words

我正在尝试在表格中搜索特定的单词。

说我有一个单词列表:打印机,网络,无线,紧急

我只想返回所有这些单词都在其中的那些行。

SELECT * FROM tickets WHERE concat(subject,body) REGEXP "printer|network|wireless|urgent" 

将返回任何一行中的任何一行。 我怎样才能使它只返回所有这些单词都在其中的那些行。

谢谢,

有两种方法可以做到这一点。 首先是相当明显的方法。 假设您有所有需要显示在名为$ 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%的速度相当慢,因此此查询可能会因庞大的表和/或大量必要的单词而导致性能问题。

另一种方法是在subjectbody上使用FULLTEXT索引。 您可以像这样使用全文MATCH IN BOOLEAN MODE

$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';

foreach ($necessaryWords as $word)
    $sql .= ' +' . $word;
$sql .= '")';

请注意,您的表必须使用MyISAM才能使用FULLTEXT索引。 更新: 从MySQL 5.6开始InnoDB支持FULLTEXT索引。 我猜这可能是更好的选择性能明智的选择。 在布尔模式下全文的更多文档可以在手册中找到。

不是最好的方式,但是:

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"
SELECT * FROM tickets WHERE
   concat(subject,body) LIKE "%printer%" AND
   concat(subject,body) LIKE "%network%" AND
   concat(subject,body) LIKE "%wireless%" AND
   concat(subject,body) LIKE "%urgent%"

不确定这适用于MySQL正则表达式引擎,但下面的正则表达式(使用lookarounds)可以实现您正在寻找的。 无论发生的顺序如何,都会找到感兴趣的词:

^(?=.*printer)(?=.*network)(?=.*wireless)(?=.*urgent).*$

演示: http//www.rubular.com/r/XcVz5xMZcb

此处提供一些正则表达式的环回示例: http : //www.rexegg.com/regex-lookarounds.html

另一种答案,只是因为当我查看你的问题时我想到了它。 我不知道它是否比其他答案更快(很可能没有):

(SELECT * FROM tickets WHERE subject LIKE "%printer%" OR body LIKE "%printer%")
UNION
(SELECT * FROM tickets WHERE subject LIKE "%network%" OR body LIKE "%network%")
UNION
(SELECT * FROM tickets WHERE subject LIKE "%wireless%" OR body LIKE "%wireless%")
UNION
(SELECT * FROM tickets WHERE subject LIKE "%urgent%" OR body LIKE "%urgent%")

更新:这是错误的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM