我正在尝试在表格中搜索特定的单词.
说我有一个单词列表:打印机,网络,无线,紧急
我只想返回所有这些单词都在其中的那些行.
SELECT * FROM tickets WHERE concat(subject,body) REGEXP "printer|network|wireless|urgent"
Run Code Online (Sandbox Code Playgroud)
将返回任何一行中的任何一行.我怎样才能使它只返回所有这些单词都在其中的那些行.
谢谢,
有两种方法可以做到这一点.首先是相当明显的方法.假设您拥有需要出现在名为$ 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对指数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 .= '")';
Run Code Online (Sandbox Code Playgroud)
请注意,您的表必须使用更新:从MySQL 5.6开始,也MyISAM才能使用FULLTEXT索引.InnoDB支持FULLTEXT索引.我想这可能是性能更好的选择.有关布尔模式全文的更多文档可以在手册中找到.