Toho lze dosáhnout dvěma způsoby. První je poměrně zřejmý přístup. Řekněme, že máte všechna slova, která se musí objevit v poli $necessaryWords:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Nicméně pomocí %foo% je poměrně pomalý, protože nelze použít žádné indexy, takže tento dotaz může způsobit problémy s výkonem u velkých tabulek a/nebo velkého počtu nezbytných slov.
Jiný přístup by byl FULLTEXT index na subject a body . Můžete použít fulltext MATCH IN BOOLEAN MODE takhle:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Všimněte si, že tabulka musí používat AKTUALIZACE:Od verze MySQL 5.6
, MyISAM za účelem použití FULLTEXT indexy.InnoDB podporuje FULLTEXT také indexy. Myslím, že by to mohla být lepší volba z hlediska výkonu. Další dokumentaci k fulltextu v booleovském režimu lze nalézt v manuál
.