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
.