我正在尝试在表格中搜索特定的单词。
说我有一个单词列表:打印机,网络,无线,紧急
我只想返回包含所有这些单词的行。
SELECT * FROM tickets WHERE concat(subject,body) REGEXP "printer|network|wireless|urgent"
将返回包含任何一个单词的任何行。我怎样才能使它只返回那些包含所有这些单词的行。
谢谢,
答案 0 :(得分: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
和subject
上的body
索引。您可以像这样使用全文MATCH IN BOOLEAN MODE
:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
请注意,您的表必须使用更新:As of MySQL 5.6,MyISAM
才能使用FULLTEXT
索引。InnoDB
支持FULLTEXT
索引也是如此。我想这可能是性能更好的选择。有关布尔模式全文的更多文档可以在manual。
答案 1 :(得分: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"
答案 2 :(得分: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%"
答案 3 :(得分:0)
不确定这适用于MySQL正则表达式引擎,但下面的正则表达式(使用外观)可以实现您所需要的。无论发生的顺序如何,都会找到感兴趣的词语:
^(?=.*printer)(?=.*network)(?=.*wireless)(?=.*urgent).*$
演示:http://www.rubular.com/r/XcVz5xMZcb
此处的一些正则表达式代表示例:http://www.rexegg.com/regex-lookarounds.html
答案 4 :(得分: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%")
更新: 这是错误的