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

Requêtes MySQL Discussion :

recherche personne > x compétences


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 96
    Par défaut recherche personne > x compétences
    Bonjour,

    soit trois tables :
    personne
    p_id
    p_nom

    competence_personne
    c_id
    p_id

    competence
    c_id
    c_libelle


    Comment écrire la requête qui permettrait d'avoir toutes les personnes ayant les compétences 1 + 5 + 10 etc...

    merci d'avance

  2. #2
    Membre éclairé
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select * 
    from personne,competance_personne c1,competance_personne c2 ,competance_personne c3
    where personne.p_id = c1.p_id
    AND personne.p_id = c2.p_id
    AND personne.p_id = c3.p_id
    AND c1.c_id = 1
    AND c2.p_id = 5
    AND c3.p_id = 10

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 96
    Par défaut
    merci, si je comprend bien, je dois créer autant d'alias que de compétence recherchée...

  4. #4
    Membre éclairé
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Par défaut
    ou (pour éviter les alias ^^):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    select * from personne where 
    p_id = (select p_id from competance_personne where c_id=1)
    AND p_id = (select p_id from competance_personne where c_id=5)
    AND p_id = (select p_id from competance_personne where c_id=10)
    il doit même exister mieux !!!

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 96
    Par défaut
    J'espère qu'il y a mieux,
    là les perfs sont catastrophiques !!!

    merci pour l'aide

  6. #6
    Membre éclairé
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Par défaut
    la seconde solution est moins lourde ^^

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Bonjour,

    Alors, à part faire autant de jointures que tu as de conditions d'égalités à tester, ça n'est pas évident.
    Tu peux essayer de passer par la fonction GROUP_CONCAT de MySQL, qui permet de grouper, avec un séparateur, toutes les occurences d'un même groupe dans une seule chaîne de caractères.
    Il faut ensuite rechercher, dans cette chaîne, les valeurs 1, 5 et 10, avec la fonction INSTR. Seul problème, c'est que 10 contient 1. Donc une personne qui aurait 5 et 10 peut sortir au test... alors qu'elle n'a pas la compétence 1...
    Donc, il faut encore ruser un coup de plus, pour concaténer non pas seulement le numéro de la compétence, mais ce numéro, plus un autre caractère, qui permettra de distinguer 1 et 10 dans l'analyse d'une chaîne de caractères.

    Bref, ça ressemble à une énorme bidouille , mais ça fonctionne avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.p_nom, GROUP_CONCAT(CONCAT(cp.c_id, '.') ORDER BY cp.c_id SEPARATOR ',')
    FROM personne p
    INNER JOIN competence_personne cp ON p.p_id = cp.p_id
    GROUP BY p.p_nom
    HAVING INSTR(GROUP_CONCAT(CONCAT(cp.c_id, '.') ORDER BY cp.c_id separator ','), '1.') > 0
    AND INSTR(GROUP_CONCAT(CONCAT(cp.c_id, '.') ORDER BY cp.c_id SEPARATOR ','), '5.') > 0
    AND INSTR(GROUP_CONCAT(CONCAT(cp.c_id, '.') ORDER BY cp.c_id SEPARATOR ','), '10.') > 0
    Ne reste plus alors, pour tester une compétence en plus (par exemple la 6) qu'à l'ajouter dans le HAVING sans oublier le "." derrière le 6 .

    OK, je reconnais que c'est tiré par les cheveux, mais ça marche et pour le coup, il ne doit pas y avoir des perfs dégradées (y'a pas une sous-requête, dans ma bidouille ).

    ced

    PS : personnellement, je préfère la solution avec les jointures, mais écrites à la mode SQL 92, pas SQL 86, parce que c'est plus lisible et plus facile à faire évoluer (pour ajouter une compétence, on copie une condition de jointure, on la colle et on l'adapte) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.p_nom
    FROM personne p
    INNER JOIN competence_personne cp1 ON p.p_id = cp1.p_id AND cp1.c_id = 1
    INNER JOIN competence_personne cp5 ON p.p_id = cp5.p_id AND cp5.c_id = 5
    INNER JOIN competence_personne cp10 ON p.p_id = cp10.p_id AND cp10.c_id = 10
    C'est quand même moins crade que ma belle bidouille, non ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/06/2009, 14h02
  2. RECHERCHE personne maitrisant le flash
    Par trunk dans le forum Flash
    Réponses: 2
    Dernier message: 05/01/2007, 15h33
  3. Réponses: 4
    Dernier message: 07/07/2006, 15h09
  4. recherche personne pour faire un site
    Par Emcy38 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 14/01/2006, 15h35

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