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
.