Il y a deux façons de faire ça. La première est l'approche assez évidente. Disons que vous avez tous les mots qui doivent apparaître dans un tableau appelé $necessaryWords :
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Cependant, en utilisant %foo%
est plutôt lent, car aucun index ne peut être utilisé, donc cette requête peut entraîner des problèmes de performances avec des tables volumineuses et/ou un nombre élevé de mots nécessaires.
L'autre approche serait un FULLTEXT
index sur subject
et body
. Vous pouvez utiliser le texte intégral MATCH IN BOOLEAN MODE
comme ceci :
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Notez que votre table doit utiliser MISE À JOUR :À partir de MySQL 5.6
, MyISAM
afin d'utiliser FULLTEXT
index.InnoDB
prend en charge FULLTEXT
les index aussi. Je suppose que cela pourrait être le meilleur choix en termes de performances. Une documentation supplémentaire sur le texte intégral en mode booléen peut être trouvée dans le manuel
.