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

Est-il possible de traiter les traits d'union et les espaces de la même manière en SQL ?

Comme quelqu'un l'a suggéré, vous pouvez simplement vous adapter et utiliser la recherche en texte intégral.

Si vous choisissez d'emprunter cette voie, vous devrez activer la recherche en texte intégral dans les champs requis.

Je suppose que vous vérifierez post_title et post_body (?), qui ont besoin de vous pour l'exécuter ;

ALTER TABLE `posts` ADD FULLTEXT KEY `post_search` (`post_title`,`post_body`);

Lorsque cela est fait, votre requête de recherche peut facilement être modifiée pour devenir ;

$sql = "SELECT * FROM `posts` WHERE MATCH(post_title,post_body) AGAINST '$search'";

Si vous souhaitez une meilleure correspondance, il est également possible de lui attribuer un score et de l'ordonner, ce qui nécessiterait un code similaire à celui-ci :

$sql = "SELECT *, MATCH(post_title, post_body) AGAINST ('{$search}') AS score ".
       "FROM `posts` WHERE MATCH(post_title, post_body) AGAINST ('{$search}') ORDER BY `score` DESC";

--- REMARQUES

Pour la recherche, vous devez déterminer comment vous effectuerez la recherche.

Dans le dernier cas que j'ai utilisé similaire, j'avais simplement un formulaire pour le terme de recherche (nommé "Recherche") résultant en l'envoi de $_POST['search'] au serveur.

J'ai alors utilisé ;

$search = (array_key_exists('search', $_POST) && is_string($_POST['search'])) ? mysql_real_escape_string($_POST['search'], $c) : FALSE ;
if ($search) {
    // Do the fulltext query requires (See above)
}

Étant donné que la recherche en texte intégral ne tient pas compte du trait d'union, il ne vous reste que des espaces, ce qui fonctionne très bien pour le texte intégral, si vous choisissez d'utiliser des résultats notés.