IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Recherche d'un mot avec LIKE sur plusieurs champs


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Recherche d'un mot avec LIKE sur plusieurs champs
    Salut ,
    je suis débutant en SQL et j'ai un probléme de requete pour rechercher un ou plusieurs mots sur plusieurs champs d'une table.
    J'ai vraiment cherché dans les tuts et forums Access et SQL , si la réponse y était , j'ai pas percuté alors pardon si j'ai raté quelquechose.

    Je voudrais faire un moteur de recherche en ASP sur plusieurs champs d'une base Access 2000 et les seules requetes que j'ai pu faire fonctionner c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    "SELECT * FROM Matable 
    WHERE lechamp1 LIKE '%le_mot_ke_je_cherche%' 
    OR lechamp2 LIKE '%le_mot_ke_je_cherche%' 
    OR lechamp3 LIKE '%le_mot_ke_je_cherche%' "
    .... etc ....

    Comme je dois faire une recherche sur plusieurs champs avec des recherches genre " tel_mot " + " tel_mot " - " tel_autre_mot " , je me retrouve a créer dynamiquement des requetes assez terribles.
    Je cherche la syntaxe SQL pour effectuer une recherche de type LIKE sur un ensemble de champs , un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "SELECT * FROM Matable 
    WHERE lechamp1,lechamp2,lechamp3 LIKE '%le_mot_ke_je_cherche%' "
    , la virgule signifiant OR, la présence du mot sur un seul de ces champs étant suffisant.

    Si quelqu'un à la réponse a mon probléme en SQL général je le remercie d'avance et comme on m'as dit que le SQL d'Access était un peu schtroumpfs, je suis preneur aussi d'une solution adapté.
    Salut et merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Bah les OR c'est aussi bien non ?

  3. #3
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par orafrance
    Bah les OR c'est aussi bien non ?

    +1
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Vous êtes à 1 pas de la reponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * 
    FROM Matable 
    WHERE lechamp1 + lechamp2+lechamp3 LIKE '%le_mot_ke_je_cherche%'

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  5. #5
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par WOLO Laurent
    Vous êtes à 1 pas de la reponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * 
    FROM Matable 
    WHERE lechamp1 + lechamp2+lechamp3 LIKE '%le_mot_ke_je_cherche%'
    Ah ... pas mal !!!
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  6. #6
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    YAZOU !!,
    Trop bien , le OR fonctionne mais tester les différents cas pour mes 7 champs ça faisait générer a l' ASP un SQL pas super propre genre :
    si "le_mot" dans champ1 ou si "le_mot" dans champ2 ..... etc x7
    and
    si "l'autre_mot" dans champ1 ou si "l'autre_mot" dans champ2 .. etc x7
    and
    ......

    Là ça fait de suite plus logique (et plus simple a coder ) d'assembler les champs puis de poser la question sur l'ensemble.
    Je fais un tableau avec les mots a chercher ou exclure et zou !

    MERCI infiniment WOLO Laurent et les autres aussi pour votre avis

  7. #7
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    vttman avait déjà dit bravo
    Merci.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par WOLO Laurent
    Vous êtes à 1 pas de la reponse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * 
    FROM Matable 
    WHERE lechamp1 + lechamp2+lechamp3 LIKE '%le_mot_ke_je_cherche%'
    Bonjour
    Débutant aussi, je cherche un truc similaire qui marcherait avec MySQL
    Le but est de n'avoir qu'un seul LIKE bien entendu

    avec les + il ne me trouve rien !
    et en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE lechamp1 OR lechamp2 LIKE '%le_mot_ke_je_cherche%'
    il effectue la recherche sur lechamps2 seulement

    merci de m'aider

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Pas beau tout ça parce que si une des colonnes est NULL il n'y aura JAMAIS AUCUN résultat car toto + NULL = NULL !!!!

    Il faut donc dénullifier les colonnes préalablement.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE COALESCE(Col1, '') || COALESCE(Col2, '') LIKE ...
    Nota : || est l'opérateur de concaténation à la norme SQL.

    Mais hélas un autre problème surgit, bien plus vicieux :

    Imaginons que nous cherchions le mot "rapetout"...
    Notre table contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Col1                  Col2
    -------------         ------------
    Utiliser une rape     tout le monde le sait
    En faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE COALESCE(Col1, '') || COALESCE(Col2, '') LIKE '%'rapetout%'
    Le résultat va être positif et pourtant le mot ne se trouve dans aucune colonne !

    La solution est d'introduire dans la concaténation un caractère disruptif afin de ne pas provoquer cette erreur.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE COALESCE(Col1, '') || '~' ||  COALESCE(Col2, '') LIKE '%'rapetout%'
    Et voila !

    Vous pouvez quand même me remercier... ;-)

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Et bien ça marche pas.
    Plus exactement, ça me trouve seulement dans Col2 "rapetout" si je cherche "rapetout"

    j'ai essayé avec et sans '~'

    y a pas une erreur ? >> '%'rapetout'
    bref, j'ai tout essayé....sauf le bonne méthode

    Merci quand même et re-merci d'avance

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par SQLpro
    Et voila !

    Vous pouvez quand même me remercier... ;-)

    A +
    MDR
    bien vu la feinte

    j_marc merci de mettre la requête que tu exécutes

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Salut
    J'ai essayé la solution de SQLpro avec et sans '~'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql="SELECT * FROM $table WHERE COALESCE(nom, '')|| '~' || COALESCE(prenom, '') LIKE '%jean%'";
    il va donc me trouver
    jean DUPOND
    mais pas
    jeanne DURAND ni david JEAN

    En fait, l'idée c'est définir une varaible qui indique à MySQL où chercher
    voici un bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if ($var  == 1) $QuelChamps ='nom';
    if ($var  == 2) $QuelChamps ='prenom';
    if ($var  == 3) $QuelChamps ='nom + prenom';
    if ($var  == 4) $QuelChamps ='tous les champs'; 
    $sql="SELECT * FROM $table WHERE $QuelChamps LIKE \"%$tab[0]%\" ";
     
    for($i=1 ; $i<$nb; $i++){ // $nb >> nombre de mots recherchés stockés dans $tab[]
    	$sql.="$bool $QuelChamps LIKE \"%$tab[$i]%\" ";	//boucle pour integrer tous les mots dans la requête
    }
    Je pourrais faire une boucle dans la boucle for, qui intègrera à son tour tous les champs dans lesquels chercher, mais faut voir si mon idée de départ (si elle peut se réaliser) est plus simple et moins exigeante en terme de perf

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par j_marc
    il va donc me trouver
    jean DUPOND
    mais pas
    jeanne DURAND ni david JEAN
    attention aux majuscules

    Jeanne != %jean%
    JEAN != %jean%

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Avec ou sans maj, c'est pareil

    Je vais fair une 2ème boucle alors, tant pis

    Merci quand même

  15. #15
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    La requête fonctionne c'est garantie à 100%, le probléme doit venir de tes paramétres

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    >> le probléme doit venir de tes paramétres

    paramétres ? de ma table ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE ca_qui (
      qui_id int(5) unsigned NOT NULL auto_increment,
      nom varchar(30) NOT NULL default '_',
      prenom varchar(30) NOT NULL default '',
      ou_id int(5) unsigned NOT NULL default '0',
      rep_id tinyint(2) unsigned NOT NULL default '1',
      email varchar(50) default NULL,
      site varchar(50) default NULL,
      notes varchar(255) default NULL,
      PRIMARY KEY  (qui_id)
    ) TYPE=MyISAM;
    Peut être que je dois mettre des index, fulltext ou je ne sais trop quoi... Me manque des bases en SQL non ? mais bon je commence avec quelquechose de basique

  17. #17
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 92
    Points : 70
    Points
    70
    Par défaut
    Hello,

    Pour utiliser ce genre de requête avec MySql, il faut utiliser la fonction CONCAT, ou encore mieux, WS_CONCAT car MySql n'utilise pas || comme opérateur de concaténation.

    Un petit exemple (qui marche !!!) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *  FROM personne, entreprise  WHERE personne.entr_id = entreprise.entr_id  AND CONCAT_WS( '~', COALESCE( `entr_nom` , '' ),  COALESCE( `entr_tel` , '' ),  COALESCE( `entr_fax` , '' ),  COALESCE( `entr_email` , '' ),    COALESCE( `pers_nom` , '' ),  COALESCE( `pers_prenom` , '' )) LIKE '%toto%'
    J'ai mis du temps à trouver. Un grand merci à tous pour le coup de la concaténation dans une clause WHERE car je ne connaissais pas ça.

    Petite question subsidiaire : comment ne pas tenir compte de la casse dans ma recherche ? (dois-je changer le paramétrage de ma base ?)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/02/2015, 08h32
  2. [AC-2007] plusieurs counts avec critères sur plusieurs champs
    Par edogawa59 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 11/10/2010, 15h32
  3. Réponses: 9
    Dernier message: 03/08/2007, 15h13
  4. Requête sur plusieurs champs avec LIKE
    Par zestrellita dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/04/2007, 14h58
  5. Réponses: 1
    Dernier message: 29/11/2006, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo