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 :

select sur une relation n:n


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut select sur une relation n:n
    Bonjour,

    Je fais des sites internet à mes heures perdues (php-mysql) et je suis devant un problème que je n'arrive pas à résoudre.

    J'ai 3 tables:
    • Personnes (idPers, nom,...)
    • competence (idComp, competence,...)
    • comp_pers (idPers, idComp)


    Il y a une relation n:n entre les table personnes et comp_pers et également entre competence et comp_pers

    Je désire sortir les personnes qui ont les compétences x, y et z.

    Est-ce que quelqu'un pourrait m'aider s'il vous plait.
    Merci d'avance

  2. #2
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 287
    Points
    7 287
    Par défaut
    Bonjour, ce que tu souhaites faire s'appelle une jointure.

    Je t'invite à regarder la doc de MySQL pour voir les différents types de jointures (interne, externe à gauche, externe à droite, etc).


    Dans ton cas, tu devrais avoir un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select
        *
    from Personnes p
        inner join comp_pers cp
            on (p.idPers = cp.idPers)
        inner join competence c
            on (cp.idComp = c.idComp)
    where c.competence in (x, y, z)
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  3. #3
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    La solution donnée n'est pas exacte, car elle ne répond pas a l'expression des besoins du demandeur ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE c.competence IN (x, y, z)
    sera considéré comme un OR, mais il veut un AND !


    Ce genre de requête peut vous aider, à tester et adapter !
    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
    SELECT 
    	c.idPers
    FROM
    	comp_pers c 
    INNER JOIN
    	competence e
    ON
    	(e.idComp = c.idcomp)
    WHERE
    	e.competence in (x,y,z)
    GROUP BY
    	c.idPers
    HAVING
    	/* Vous pouvez Ecrire 
     
    	   count(1) = 3 
     
    	   Mais si vous essayez de faire une requete
    	   generique, il est peut etre preferable de
    	   passer par ce petit bout de code
     	*/
    	count(1) = (
    			SELECT 
    				Count(1)
    			FROM
    				competence
    			WHERE
    				competence IN (x,y,z)
    		   )
    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  4. #4
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 287
    Points
    7 287
    Par défaut
    Mea culpa, j'avais pas vu le ET
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  5. #5
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Comme dans le cas de rgomes, vous pourriez aussi paraphraser la division relationnelle :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT Nom
    FROM   PERSONNE AS a
    WHERE  NOT EXISTS
          (SELECT *
           FROM   COMPETENCE AS b
           WHERE  b.Competence IN (x, y, z)
           AND    NOT EXISTS
                 (SELECT  *
                  FROM    COMP_PERS AS c
                  WHERE   a.IdPers = c.IdPers 
                  AND     b.IdComp = c.IdComp
                 )
          ) ;
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/02/2007, 14h41
  2. Temps d'execution d'un select sur une vue
    Par rosewood dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/02/2005, 16h06
  3. pb d'insertion avec un SELECT sur une autre table
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 22h58
  4. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 08h42
  5. Recupération des selections sur une DBGrille multi Selection
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/11/2004, 11h43

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