Der er to måder at gøre dette på. Den første er den ret indlysende tilgang. Lad os sige, at du har alle de ord, der skal vises i et array kaldet $necessaryWords:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Men ved at bruge %foo%
er ret langsom, da ingen indekser kan bruges, så denne forespørgsel kan forårsage ydeevneproblemer med store tabeller og/eller et stort antal nødvendige ord.
Den anden fremgangsmåde ville være en FULLTEXT
indeks på subject
og body
. Du kan bruge fuldteksten MATCH IN BOOLEAN MODE
sådan her:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Bemærk, at din tabel skal bruge OPDATERING:Fra og med MySQL 5.6
, MyISAM
for at bruge FULLTEXT
indekser.InnoDB
understøtter FULLTEXT
også indekser. Jeg gætter på, at dette kunne være det bedre valg med hensyn til ydeevne. Yderligere dokumentation om fuldteksten i boolesk tilstand kan findes i manual
.