Mysql,PHP,搜索多个单词

Dob*_*tJr 2 php mysql search

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

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

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

SELECT * FROM tickets WHERE concat(subject,body) REGEXP "printer|network|wireless|urgent" 
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

The*_*olf 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
Run Code Online (Sandbox Code Playgroud)

但是,使用 %foo%速度相当慢,因为不能使用任何索引,因此此查询可能会导致大表和/或大量必要单词的性能问题.

另一种方法将是FULLTEXT对指数subjectbody.你可以使用全文MATCH IN BOOLEAN MODE像这样:

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

foreach ($necessaryWords as $word)
    $sql .= ' +' . $word;
$sql .= '")';
Run Code Online (Sandbox Code Playgroud)

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