Można to zrobić na dwa sposoby. Pierwsze to dość oczywiste podejście. Załóżmy, że masz wszystkie słowa, które muszą pojawić się w tablicy o nazwie $necessaryWords:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Jednak używając %foo%
jest raczej powolny, ponieważ nie można używać żadnych indeksów, więc to zapytanie może powodować problemy z wydajnością przy dużych tabelach i/lub dużej liczbie niezbędnych słów.
Inne podejście to FULLTEXT
indeks na subject
i body
. Możesz użyć pełnotekstowego MATCH IN BOOLEAN MODE
tak:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Pamiętaj, że Twoja tabela musi używać AKTUALIZACJA:Od MySQL 5.6
, MyISAM
aby użyć FULLTEXT
indeksy.InnoDB
obsługuje FULLTEXT
indeksy. Myślę, że może to być lepszy wybór pod względem wydajności. Dalszą dokumentację dotyczącą pełnego tekstu w trybie logicznym można znaleźć w instrukcja
.