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
.