Existem duas maneiras de fazer isso. A primeira é a abordagem bastante óbvia. Digamos que você tenha todas as palavras que precisam aparecer em um array chamado $necessaryWords:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
No entanto, usando
%foo% é bastante lento, pois nenhum índice pode ser usado, portanto, essa consulta pode causar problemas de desempenho com tabelas enormes e/ou um alto número de palavras necessárias. A outra abordagem seria um
FULLTEXT índice em subject e body . Você pode usar o texto completo MATCH IN BOOLEAN MODE assim:$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
MyISAM para usar FULLTEXT índices.InnoDB suporta FULLTEXT índices também. Eu acho que isso poderia ser a melhor escolha em termos de desempenho. Mais documentação sobre o texto completo em modo booleano pode ser encontrada em manual
.