Hay dos maneras de hacer esto. El primero es el enfoque bastante obvio. Digamos que tiene todas las palabras que deben aparecer en una matriz llamada $palabrasnecesarias:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Sin embargo, usando %foo%
es bastante lento, ya que no se pueden usar índices, por lo que esta consulta puede causar problemas de rendimiento con tablas grandes y/o una gran cantidad de palabras necesarias.
El otro enfoque sería un FULLTEXT
índice sobre subject
y body
. Podría usar el texto completo MATCH IN BOOLEAN MODE
así:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Tenga en cuenta que su tabla debe usar ACTUALIZACIÓN:A partir de MySQL 5.6
, MyISAM
para usar FULLTEXT
índices.InnoDB
admite FULLTEXT
índices también. Supongo que esta podría ser la mejor opción en cuanto a rendimiento. Se puede encontrar más documentación sobre el texto completo en modo booleano en instrucciones
.