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 :

Requete affichage compétence sans doublon


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut Requete affichage compétence sans doublon
    Voici les données de base :
    3 tables:
    personnes
    compétences
    participation

    une personne a N compétences
    une personne peux s'inscrire a un activité (participation)

    comment puis lister les compétences sans doublon de personne
    ex :
    persoA a pour compétence A, B, C
    persoB a pour compétence B, C
    persoC a pour compétence C
    persoD a pour compétence C

    je veux
    nb competence A = 1
    nb competence B = 1
    nb competence C = 2

    j'ai la possibilité de faire un peu de php si une requete sql seule ne suffit pas.
    En création de fonction je peux passer la liste des compétences requises dans un ordre défini.
    ex :
    function nb_par_competence ($comp=array('A','B','C')){

    }

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Pas sûr d'avoir compris...
    Tu veux lister les compétences disponibles dans la table participation ?

    Par ailleurs :
    une personne a N compétences
    Ceci suppose qu'il y ait une table associative entre les personnes et les compétences.
    Le MCD est le suivant :
    Personne -1,n----Qualifier----0,n- Competence

    Ce qui entraîne les tables :
    Personne (P_Id, P_Nom, P_Prenom...)
    Competence (C_Id, C_Libelle...)
    Qualifier (Q_IdPersonne, Q_IdCompetence...)

    De même, il faudrait préciser ceci :
    une personne peux s'inscrire a un activité (participation)
    Elle ne peut s'inscrire qu'à une seule activité ?

    Enfin, la vraie structure de vos tables nous aiderait à répondre.
    Et avez-vous un début de requête à proposer ?

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

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut
    Voici la structure

    personne (p_id)
    competence(p_id, c_id)

    participation(evt_id, p_id)

    une personne peut avoir N compétences
    une personne peut s'inscrire a N participation

    je veux vérifier si , dans la participation a un et un seul événement, j'ai les compétences requises. je peux donner les compétences par défaut (A,B,C)

    il me faut
    1) trouver le nombre de personnes avec la compétence (A),
    2) exclure ces personnes de la liste a analyser,
    3) compter le nombre de personnes restantes avec la compétence (B),
    4) etc...

    d'où le tableau final
    nb competence A = ?
    nb competence B = ?
    etc...


    merci pour votre aide, j'espère avoir été plus clair.


    ma requete de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select qp.type, count(qp.type) 
    from evenement_participation ep , personnes p, qualification q, competences qp
    where e_code=1
    and ep.p_id=p.p_id
    and p.p_id=q.p_id
    and q.ps_id=qp.ps_id
    and qp.type in ('A','B')
    group by qp.type
    mais là j'ai toujours un doublon...

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par coyote90 Voir le message
    je veux vérifier si , dans la participation a un et un seul événement, j'ai les compétences requises.
    Et elles sont stockées où ces compétences requises ?

    je peux donner les compétences par défaut (A,B,C)
    Comment ça compétences par défaut ?
    C'est le programme qui décide ?

    il me faut
    1) trouver le nombre de personnes avec la compétence (A),
    2) exclure ces personnes de la liste a analyser,
    3) compter le nombre de personnes restantes avec la compétence (B),
    4) etc...

    d'où le tableau final
    nb competence A = ?
    nb competence B = ?
    etc...
    Vu le résultat que tu donnais dans le précédent message :
    je veux
    nb competence A = 1
    nb competence B = 1
    nb competence C = 2
    Par rapport aux données de départ :
    comment puis lister les compétences sans doublon de personne
    ex :
    persoA a pour compétence A, B, C
    persoB a pour compétence B, C
    persoC a pour compétence C
    persoD a pour compétence C
    Je ne suis pas sûr de bien comprendre encore !

    Tu veux compter combien de personnes il y a par compétence pour une participation donnée ?


    ma requete de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select qp.type, count(qp.type) 
    from evenement_participation ep , personnes p, qualification q, competences qp
    where e_code=1
    and ep.p_id=p.p_id
    and p.p_id=q.p_id
    and q.ps_id=qp.ps_id
    and qp.type in ('A','B')
    group by qp.type
    mais là j'ai toujours un doublon...
    Utilisons la syntaxe normalisée depuis 1992 pour les jointures, ce sera déjà plus lisible. Et avec un COUNT(*), ça donne quoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT qp.type, count(*) AS Nombre_personnes
    FROM evenement_participation ep 
    INNER JOIN personnes p ON ep.p_id = p.p_id
      INNER JOIN qualification q ON p.p_id = q.p_id
        INNER JOIN competences qp ON q.ps_id = qp.ps_id
    WHERE e_code=1
      AND qp.type IN ('A','B')
    GROUP BY qp.type
    e_code vient de quelle table ? C'est le code de l'événement choisi ?

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

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut
    Une activité nécessite des personnes avec des compétences particulières.
    Chaque personne peut avoir plusieurs compétences mais il faut qu'une personne ne soit pas comptée plusieurs fois.

    ex :
    perso A a les compétences A + B + C
    perso B a les compétences B + C
    perso C a la compétence C
    perso D a la compétence C

    le résultat de la requête ne doit pas compter deux fois la même personne,
    'A' peut pas être affectée aux taches nécessitant les compétences B et C car elle est déjà engagée sur sa compétence A.

    la requête précédente indique que j'ai
    1 personne avec la compétence A
    2 personnes avec la compétence B
    4 personnes avec la compétence C

    alors que j'attends la réponse suivante
    1 personne avec la compétence A (j'ignore le fait qu'elle soit également compétente sur B et C)
    1 personne avec la compétence B
    2 personne avec la compétence C

    j'ai réussi une pseudo fonction php mais je pense qu'elle peut être améliorée...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    function affichage_nb_competences($evt="1",$comp=array('A','B','C')){
    $listePers=array("-1");
    	foreach ($comp as $c){
    		$sql="select p.p_id, qp.type, count(qp.type) nb
    from evenement_participation ep , personne p, qualification q, competence qp
    where e_code='$evt'
    and ep.p_id=p.p_id
    and p.p_id=q.p_id
    and q.ps_id=qp.ps_id
    and qp.type = '$c'
    and p.p_id not in(".implode(",",$listePers).")
    ;";
    		$res = mysql_query($sql) or die ("Erreur :<br/>".mysql_error());
    		if(mysql_num_rows($res)>0){
    			$out="";
    			while($row=mysql_fetch_array($res)){
    				for ($i=0;$i<=mysql_num_fields($res);$i++){
    					if(!in_array($row['p_id'],$listePers) && $row['p_id']<>"" ){
    						$out .= "<br/>Nb ".$row['type']." = ".$row['nb'];
    						$listePers[]=$row['p_id'];
    					}
    				}
    			}
    			echo $out;
    		}else{
    			echo "<br/>$c = pas de réponse";
    		}
    	}
    }

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Je ne vois vraiment aucune logique applicable à ce problème en SQL.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par coyote90 Voir le message
    Une activité nécessite des personnes avec des compétences particulières.
    Déjà, ce morceau ne figure pas dans la structure que tu nous as donnée plus haut :
    Voici la structure

    personne (p_id)
    competence(p_id, c_id)

    participation(evt_id, p_id)

    une personne peut avoir N compétences
    une personne peut s'inscrire a N participation
    Le schéma du premier morceau est :
    Activité -1,n----Nécessiter----0,n- Compétence

    Ce qui donne les tables :
    Compétence (C_Id, C_Libelle)
    Activite (A_Id, A_Libelle...)
    Activite_Competence (AC_IdActivite, AC_IdCompetence)

    Chaque personne peut avoir plusieurs compétences
    Voici le schéma de ce deuxième morceau :
    Personne -0,n----Avoir----0,n- Competence

    J'ajoute les tables :
    Personne (P_Id, P_Nom, P_Prenom...)
    Personne_Competence (PC_IdPersonne, PC_IdCompetence)

    Après la logique se complique...
    mais il faut qu'une personne ne soit pas comptée plusieurs fois.

    ex :
    perso A a les compétences A + B + C
    perso B a les compétences B + C
    perso C a la compétence C
    perso D a la compétence C

    le résultat de la requête ne doit pas compter deux fois la même personne,
    'A' peut pas être affectée aux taches nécessitant les compétences B et C car elle est déjà engagée sur sa compétence A.
    Qu'est-ce qui dit qu'elle est déjà engagée sur sa compétence A ?
    Il n'y a pas d'ordre a priori dans une BDD.
    Rien ne dit que la compétence A sera extraite avant la compétence B puis la C.

    la requête précédente indique que j'ai
    1 personne avec la compétence A
    2 personnes avec la compétence B
    4 personnes avec la compétence C

    alors que j'attends la réponse suivante
    1 personne avec la compétence A (j'ignore le fait qu'elle soit également compétente sur B et C)
    1 personne avec la compétence B
    2 personne avec la compétence C
    J'ai essayé de trouver une logique (un algoritme) qui serait applicable mais vu l'heure j'y renonce.


    j'ai réussi une pseudo fonction php mais je pense qu'elle peut être améliorée...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    function affichage_nb_competences($evt="1",$comp=array('A','B','C')){
    $listePers=array("-1");
        foreach ($comp as $c){
            $sql="select p.p_id, qp.type, count(qp.type) nb
    from evenement_participation ep , personne p, qualification q, competence qp
    where e_code='$evt'
    and ep.p_id=p.p_id
    and p.p_id=q.p_id
    and q.ps_id=qp.ps_id
    and qp.type = '$c'
    and p.p_id not in(".implode(",",$listePers).")
    ;";
            $res = mysql_query($sql) or die ("Erreur :<br/>".mysql_error());
            if(mysql_num_rows($res)>0){
                $out="";
                while($row=mysql_fetch_array($res)){
                    for ($i=0;$i<=mysql_num_fields($res);$i++){
                        if(!in_array($row['p_id'],$listePers) && $row['p_id']<>"" ){
                            $out .= "<br/>Nb ".$row['type']." = ".$row['nb'];
                            $listePers[]=$row['p_id'];
                        }
                    }
                }
                echo $out;
            }else{
                echo "<br/>$c = pas de réponse";
            }
        }
    }
    Je vois que tu t'obstines à écrire les jointures avec une syntaxe obsolète depuis 17 ans...

    Bon si ta fonction php répond à ton besoin, comme on est dans le forum MySQL, on va peut être s'arrêter là.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Je vois que tu t'obstines à écrire les jointures avec une syntaxe obsolète depuis 17 ans...
    et pourtant cela ne fait pas 17 ans que je programme... mais je vais dès maintenant essayer de me mettre a la norme

    Citation Envoyé par CinePhil Voir le message
    Il n'y a pas d'ordre a priori dans une BDD.
    Rien ne dit que la compétence A sera extraite avant la compétence B puis la C.
    C'est pour cela que je passe en paramètre de ma fonction, les compétences dans un ordre définit... il faudra certainement que je prévoit de hiérarchiser les compétences dans la base.


    merci pour votre aide...

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

Discussions similaires

  1. Requete SELECT SQL sans doublon
    Par arnaud_76 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 17/11/2014, 07h01
  2. Affichage lignes SQL sans doublons
    Par Aquellito dans le forum ASP
    Réponses: 2
    Dernier message: 23/03/2009, 16h11
  3. requete selection sans doublons
    Par fred75 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/03/2008, 19h59
  4. [SQL] Affichage des resultats sans doublons
    Par Luverger dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/08/2007, 14h28
  5. Requête sans doublons
    Par adurand dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 07/12/2006, 22h53

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