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

Catégorie : SQL | Tag : , , , , ,
Share

Après avoir parlé un peu de la recherche en MySQL via [LIKE|/post/2009/mysql-et-la-recherche-avec-like] puis [REGEXP|/post/2009/mysql-et-la-recherche-avec-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 (met l’un à la suite de l’autre) le contenu de @@titre@@ et de @@contenu@@, c’est pas mal aussi. /// 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. Pour éviter cela, il convient d’utiliser @@CONCAT_WS@@ qui fonctionne de la même manière, sans se soucier des champs vides. /// SELECT * FROM billet WHERE CONCAT_WS(date, ‘ ‘, heure, ‘h’, minute) LIKE « 10/11/2009 23h30″; /// Ce deuxième exemple est certes moins compréhensible, mais explique bien l’intérêt d’utiliser @@CONCAT@@ plutôt que @@OR@@ dans certains cas. %%% Bien sûr, ceci fonctionne aussi très bien avec la commande @@REGEXP@@ ! Bref, vive la concaténation ! %%% %%% Puisque ses rétroliens ne semblent pas fonctionner, merci à CrazyCat de [G33k-zone|http://www.g33k-zone.org/post/2009/09/18/Concat%C3%A9nation-de-champs-avec-MySQL] 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=""> <strike> <strong>