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

Recherche de plusieurs mots-clés

$rows aura les données où votre mot-clé code correspondances dans votre tableau, vous pouvez réécrire votre code pour qu'il corresponde aux deux mots clés sous la forme

$keyword = 'hello code';
$exloded = explode(' ', $keyword);
$query = 'SELECT * FROM A ';
$i = 0;
$params = array();
foreach ($exploded as $value):
    if ($i == 0) {
        $query .= ' WHERE `text` LIKE :value_'.$i;
    } else {
        $query .= ' OR `text` LIKE :value_'.$i;
    }
    $params[':value_'.$i] = '%'.$value .'%';
    $i++;
endforeach;
$sth = $db->query($query);
$sth->execute($params);
$rows = $sth->fetchAll();
echo '<pre>';print_r($rows);echo '</pre>';
';

Créez votre requête en boucle (sur vos mots clés fournis) et attribuez des espaces réservés uniques dans la requête pour correspondre à toutes les valeurs

Modifier pour la recherche plein texte

En utilisant la recherche en texte intégral, vous pouvez faire correspondre exactement la même phrase avec le mot-clé fourni. Pour travailler avec la recherche en texte intégral, vous avez besoin d'un index de type FULLTEXT .

ALTER TABLE `A` ADD FULLTEXT INDEX `fulltextindex` (`text`); 

Et la requête ressemblera à

$keyword = 'hello code';
$exloded = explode(' ', $keyword);
$where = '';
$i = 0;
$select = array();
$params = array();

foreach ($exploded as $value):
    $select[]= ' MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE) ';
    if ($i == 0) {
        $where  .= ' WHERE MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
    } else {
        $where  .= ' OR MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
    }
    $params[':value_'.$i] =  $value ;
    $i++;
endforeach;

$query ='SELECT *,'. implode( ' + ',$select).' AS score FROM A '.$where.' ORDER BY score DESC';
$sth = $db->query($query);
$sth->execute($params);
$rows = $sth->fetchAll();
echo '<pre>';print_r($rows);echo '</pre>';
';

Le code ci-dessus produira une requête comme

SELECT *,
MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
+ 
MATCH(`text`) AGAINST('code' IN BOOLEAN MODE) AS score
FROM A 
WHERE MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
OR  MATCH(`text`) AGAINST('code' IN BOOLEAN MODE)
ORDER BY score DESC

Alias ​​score dans la requête ci-dessus aura une valeur pour chaque ligne et son score correspondant, vous pouvez donc ordonner votre résultat de manière décroissante pour afficher en premier les enregistrements qui ont le score le plus élevé.