Има два начина да направите това. Първият е доста очевидният подход. Да приемем, че имате всички думи, които трябва да се появят в масив, наречен $necessaryWords:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Въпреки това, с помощта на %foo%
е доста бавен, тъй като не могат да се използват индекси, така че тази заявка може да причини проблеми с производителността с огромни таблици и/или голям брой необходими думи.
Другият подход би бил FULLTEXT
индекс на subject
и body
. Можете да използвате пълния текст MATCH IN BOOLEAN MODE
така:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Обърнете внимание, че вашата таблица трябва да използва АКТУАЛИЗАЦИЯ:От MySQL 5.6
, MyISAM
за да използвате FULLTEXT
индекси.InnoDB
поддържа FULLTEXT
индекси също. Предполагам, че това може да е по-добрият избор по отношение на производителността. Допълнителна документация за пълния текст в булев режим може да бъде намерена в ръководство
.