Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql, PHP, recherche de plusieurs mots

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 MyISAM afin d'utiliser FULLTEXT index. MISE À JOUR :À partir de MySQL 5.6 , 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 .