Er zijn twee manieren om dit te doen. De eerste is de nogal voor de hand liggende benadering. Stel dat u alle woorden heeft die in een array met de naam $necessaryWords moeten voorkomen:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Echter, met behulp van %foo%
is nogal traag, omdat er geen indexen kunnen worden gebruikt, dus deze zoekopdracht kan prestatieproblemen veroorzaken met enorme tabellen en/of een groot aantal noodzakelijke woorden.
De andere benadering is een FULLTEXT
index op subject
en body
. Je zou de fulltext MATCH IN BOOLEAN MODE
. kunnen gebruiken zoals dit:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Houd er rekening mee dat uw tabel UPDATE:Vanaf MySQL 5.6
, MyISAM
. moet gebruiken om FULLTEXT
. te gebruiken indexen.InnoDB
ondersteunt FULLTEXT
ook indexen. Ik denk dat dit qua prestaties de betere keuze zou kunnen zijn. Verdere documentatie over de volledige tekst in booleaanse modus is te vinden in de handleiding
.