Mysql et la recherche : avec LIKE

Publié dans SQL | Marqué avec , , ,
Share

Souvent pour un moteur de recherches sur un site, on propose à l’utilisateur d’entrer un mot clef que l’on cherchera ensuite dans une base de données pour renvoyer les résultats le contenant. Ce billet, et 2 autres qui le suivront, vont présenter 3 méthodes pour effectuer ce type de recherche, en commençant par l’utilisation de LIKE. La première méthode pour effectuer une recherche avec Mysql est d’utiliser LIKE sur un champ texte.

SELECT * FROM table WHERE message LIKE "mot clef";

Cette requête renverra tous les tuples dont le champ message contient exactement la valeur « mot clef », quelque soit la casse. Pour que le résultat dépende de la casse, il faut utiliser LIKE BINARY :

SELECT * FROM table WHERE message LIKE BINARY "Mot Clef";

Mais LIKE permet de faire bien plus que cela. Pour recherche le mot « mot clef » qui se trouverait en plein milieu d’une phrase, on va utiliser le pourcentage ( % ). Le pourcentage est un joker qui correspond à « ou ou plusieurs caractères, n’importe lequel » ou à « pas de caractère ».

SELECT * FROM table WHERE message LIKE "%mot clef%";

Par exemple, les phrases : « Bonjour, j’aime ce joli mot clef tout bleu » ou « Salut beau mot clef » seront renvoyé par cette requête. Mais pas « Salut jolis mots clefs ». Dans le même style, on peut utiliser l’underscore ( _ ), c’est un autre joker qui correspond à « un et un seul caractère, n’importe lequel ».

SELECT * FROM table WHERE message LIKE "%mot_ clef_";


Dans ce cas là, la phrase « Salut jolis mots clefs », pourra être renvoyée par cette requête. Pour chercher un underscore ou un pourcentage, il suffit de les faire précéder par un back slash ( \ ).

SELECT * FROM table WHERE message LIKE "\%mot\_ clef";

Recherche le tuple où le champ « message » correspond à « %mot_ clef », quelque soit la casse. Pour préciser un autre caractère d’échappement que le back slash, il suffit de préciser ce caractère en le précédant par ESCAPE. ça peut toujours servir, qui sait ?

SELECT * FROM table WHERE message LIKE "|%mot|_ clef" ESCAPE "|";

Pour ma part, lorsque je code un moteur de recherche, je travaille souvent par requêtes successives. Par exemple :

SELECT * FROM table WHERE message LIKE "mot clef";

puis

SELECT * FROM table WHERE message LIKE "%mot clef%";

et enfin en remplaçant tous les espaces, tirets, underscores, … par des %

SELECT * FROM table WHERE message LIKE "%mot%clef%";

J’accumule ainsi les différents résultats, en faisant attention aux doublons, (par exemple en rajoutant un NOT IN (liste des ID des tuples déjà sélectionnés)) et j’obtiens un résultat final classé par ordre de pertinence. Bref, il y a de quoi faire avec cette commande là !

Une réponse à Mysql et la recherche : avec LIKE

  1. Bonjour
    Super hop ton site dans mes favoris
    J’ai laissé un comment sur un site que tu proposais

    Je n’arrive pas a trouver la syntaxe juste pour rechercher plusieurs mot clés

    Articles selectionnés
    <?php

    if(isset($_GET['mot_cle'])) {

    $mot_cle = htmlspecialchars($_GET['mot_cle']);
    $mots_recherches = explode(" ", $mot_cle); //séparation des mots
    function ajout_pourcentage($n)
    {
    return('%' . $n .'%');
    }
    $mots_recherches = array_map("ajout_pourcentage", $mots_recherches);
    echo "";
    print_r ($mots_recherches);
    echo "";

    $nombre_mots = count ($mots_recherches); //compte le nombre de mots
    echo "";
    print_r ($nombre_mots);
    echo "";
    }


    Pour chaque mot cle je souhaite donc modifier le LIKE on peux utiliser CONCAT_WS apres un like ?

    Merci

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*