Mysql et la recherche sur plusieurs champs : avec CONCAT ou CONCAT_WS

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

Après avoir parlé un peu de la recherche en MySQL via LIKE puis REGEXP, et avant d’aller plus loin, parlons un peu de la recherche dans plusieurs champs à la fois. Eh oui, c’est possible grâce à CONCAT, ou plutôt CONCAT_WS.
Prenons une table contenant les billets d’un blog, et donc possédant les champs id, titre et contenu. Une recherche classique cherchera un mot clef dans le titre et dans le contenu du billet. Pour cela, on pourrait utiliser OR, mais un CONCAT qui concatène (i.e. met l’un à la suite de l’autre) le contenu de titre et de contenu, c’est pas mal aussi ! Exemple à l’appui :

SELECT * FROM billet WHERE CONCAT(titre, contenu) LIKE "%mot%clef%";

On peut ainsi concaténer autant de champs que l’on souhaite. Un petit détails cependant, si l’un de ces champs est NULL, le résultat renvoyé est NULL. Ce qui implique qu’un article sans titre dont le contenu correspond au mot clef, ne sera pas récupérée. Même si l’exemple est débile, c’est un peu dommage. Pour éviter cela, il convient d’utiliser CONCAT_WS qui fonctionne de la même manière, sans se soucier des champs vides.
Le deuxième exemple ci-dessous est certes moins compréhensible, mais il illustre ce dont nous venons de parler, et explique bien l’intérêt d’utiliser CONCAT plutôt que OR dans certains cas.

SELECT * FROM billet WHERE CONCAT_WS(date, ' ', heure, 'h', minute) LIKE "10/11/2009 23h30";

Bien sûr, il est possible d’utiliser la commande REGEXP au lieu de LIKE ! Bref, vive la concaténation !

Puisque ses rétroliens ne semblent pas fonctionner, merci à CrazyCat de G33k-zone pour m’avoir fait découvrir cette commande SQL bien utile.

3 réponses à Mysql et la recherche sur plusieurs champs : avec CONCAT ou CONCAT_WS

  1. Tiens, mes rétro-liens ne marchent pas ? aurais-je loupé un épisode dans la configuration de dotclear ? Ils sont pourtant activés et non modérés.

    Mais je ne suis pas bien doué avec les blogs moi…

  2. Désolé, ceci n’est pas du flood mais une petite réponse à mon commentaire précédent:
    un antispam activé par défaut dans dotclear bloque les trackbacks si le billet ne contient pas un lien vers le billet initial.
    J’ai donc désactivé cette protection car il me semble que la réécriture d’url provoque d’étranges comportements dans la vérification.

  3. BN

    CrazyCat > Du coup, j’ai bien remis le rétrolien, merci ! Et merci pour ton billet, ça m’a déjà bien servi.

    J’avais déjà lu quelque chose au sujet de l’antispam en question, et ça explique que beaucoup de rétroliens ne sont pas accessibles. Enfin, pour ma part, je n’ai pas encore trouvé où le désactiver.

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>

*