2

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

假设我有一个单词列表:打印机、网络、无线、紧急

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

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

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

谢谢,

4

5 回答 5

6

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

另一种方法是在和上建立FULLTEXT索引。您可以像这样使用全文:subjectbodyMATCH 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索引。我想这可能是更好的选择性能。可以在手册中找到有关布尔模式全文的更多文档。

于 2013-10-11T21:09:59.743 回答
1

不是最好的方法,但是:

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"
于 2013-10-11T20:59:18.773 回答
0
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%"
于 2013-10-11T21:00:08.917 回答
0

不确定这是否适用于 MySQL 正则表达式引擎,但下面的正则表达式(使用环视)可以实现您正在寻找的内容。无论它们出现的顺序如何,都会找到感兴趣的词:

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

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

这里有一些正则表达式环视示例:http ://www.rexegg.com/regex-lookarounds.html

于 2013-10-11T21:06:07.963 回答
0

替代答案,只是因为我在看你的问题时想到了它。我不知道它是否会比其他答案更快(很可能不是):

(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%")

更新:这是错误的

于 2013-10-11T21:09:19.443 回答