Ci sono due modi per farlo. Il primo è l'approccio piuttosto ovvio. Supponiamo che tu abbia tutte le parole che devono apparire in un array chiamato $necessaryWords:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Tuttavia, utilizzando %foo% è piuttosto lento, poiché non è possibile utilizzare indici, quindi questa query potrebbe causare problemi di prestazioni con tabelle enormi e/o un numero elevato di parole necessarie.
L'altro approccio sarebbe un FULLTEXT indice su subject e body . Potresti usare il testo completo MATCH IN BOOLEAN MODE così:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Nota che la tua tabella deve usare AGGIORNAMENTO:A partire da MySQL 5.6
, MyISAM per utilizzare FULLTEXT indici.InnoDB supporta FULLTEXT anche gli indici. Immagino che questa potrebbe essere la scelta migliore in termini di prestazioni. Ulteriore documentazione sul testo completo in modalità booleana è disponibile in manuale
.