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 :

Jointure imbriquée compliquée


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Jointure imbriquée compliquée
    Bonsoir à tous.

    J'ai 3 tables articulés de la manière suivante :
    Une table T_contact avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ref_contact,ref_societe,nom,prenom
    une table T_societe avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ref_societe,societe,ref_famille
    et une table T_famille avec
    Donc une famille peut avoir plusieurs sociétés qui ont plusieurs contacts

    Je cherche à récupérer tous les contacts d'une même famille quand la ref_societe est égale à une valeur précise (ex : 3)

    Je bloque avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T_contact.nom,T_contact.prenom,T_societe.societe 
    FROM T_contact 
    INNER JOIN T_societe ON T_contact.ref_societe=T_societe.ref_societe 
    INNER JOIN T_famille ON T_societe.ref_famille=T_famille.ref_famille 
    WHERE  ( T_societe.ref_societe=3  ) 
    ORDER BY T_famille.ref_famille;
    Cela me donne uniquement les contacts de la société 3 et non tous les contacts de la famille.

    Merci par avance.
    david

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    DROP TABLE IF EXISTS `T_contact`;
    CREATE TABLE IF NOT EXISTS `T_contact` (
      `ref_contact` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `nom` varchar(30) NOT NULL,
      `prenom` varchar(50) DEFAULT NULL,
      `ref_societe` int(4) DEFAULT NULL,
      UNIQUE KEY `ref_contact` (`ref_contact`),
      FULLTEXT KEY `recherche` (`nom`,`prenom`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=220 ;
     
    --
    -- Contenu de la table `T_contact`
    --
     
    INSERT INTO `T_contact` (`ref_contact`, `nom`, `prenom`, `ref_societe`) VALUES
    (1, 'Contact 1 (Soc A)', NULL, 1),
    (2, 'Contact 2 (Soc B)', NULL, 2),
    (3, 'Contact 3 (Soc B)', NULL, 2),
    (4, 'Contact 4 (Soc C)', NULL, 3),
    (5, 'Contact 5 (Soc C)', NULL, 3),
    (6, 'Contact 6 (Soc D)', NULL, 4),
    (7, 'Contact 7 (Soc E)', NULL, 5),
    (8, 'Contact 8 (Soc D)', NULL, 4),
    (9, 'Contact 9 (Soc C)', NULL, 3);
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `T_famille`
    --
     
    DROP TABLE IF EXISTS `T_famille`;
    CREATE TABLE IF NOT EXISTS `T_famille` (
      `ref_famille` int(4) NOT NULL AUTO_INCREMENT,
      `nom` varchar(80) CHARACTER SET utf8 NOT NULL DEFAULT '0',
      PRIMARY KEY (`ref_famille`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=110 ;
     
    --
    -- Contenu de la table `T_famille`
    --
     
    INSERT INTO `T_famille` (`ref_famille`, `nom`) VALUES
    (1, 'Famille A'),
    (2, 'Famille B');
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `T_societe`
    --
     
    DROP TABLE IF EXISTS `T_societe`;
    CREATE TABLE IF NOT EXISTS `T_societe` (
      `ref_societe` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `societe` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `ref_famille` int(4) DEFAULT NULL,
      PRIMARY KEY (`ref_societe`),
      UNIQUE KEY `ref_societe` (`ref_societe`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=178 ;
     
    --
    -- Contenu de la table `T_societe`
    --
     
    INSERT INTO `T_societe` (`ref_societe`, `societe`, `ref_famille`) VALUES
    (1, 'Societe A F1', 1),
    (2, 'Societe B F1', 1),
    (3, 'Societe C F2', 2),
    (4, 'Societe D F1', 1),
    (5, 'Societe E F2', 2);

  2. #2
    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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 770
    Points
    23 770
    Par défaut
    Bonjour,

    Peut-être avec la requête suivante, qui ajoute une jointure pour limiter la famille à celle de la société référencée 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c.nom, c.prenom, s.societe
    FROM T_contact c
    INNER JOIN T_societe s ON c.ref_societe = s.ref_societe
    INNER JOIN T_famille f ON s.ref_famille = f.ref_famille
    INNER JOIN T_societe s2 ON f.ref_famille = s2.ref_famille AND s2.ref_societe = 3
    ORDER BY f.ref_famille;
    On peut faire la même chose avec une clause IN dans le WHERE, mais ça oblige à ajouter une sous-requête.
    On doit aussi pouvoir faire ça avec un EXISTS...

    ced

  3. #3
    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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 770
    Points
    23 770
    Par défaut
    Pour info, la même requête avec un EXISTS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.nom, c.prenom, s.societe
    FROM T_contact c
    INNER JOIN T_societe s ON c.ref_societe = s.ref_societe
    INNER JOIN T_famille f ON s.ref_famille = f.ref_famille
    WHERE EXISTS (
        SELECT *
        FROM T_societe s2
        WHERE s2.ref_famille = s.ref_famille
        AND s2.ref_societe = 3
    )
    ORDER BY f.ref_famille;
    ced

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Magic
    Merci Ced pour la rapidité et la qualité des réponses.

    Une petite explication toutefois sur l'utilisation des champs c,s,f s2 ou un lien sur un tuto explicite.

    A bientôt - David


    PS : Je cherche un vrai livre sur mysql, un conseil ??

  5. #5
    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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 770
    Points
    23 770
    Par défaut
    c, s, f ou s2 sont ce qu'on appelle des alias. En gros, ce sont des raccourcis pour le nom des tables.
    On met un alias juste après le nom dans la table dans la clause FROM, et ensuite, partout dans la requête, on n'est plus obligé de répéter le nom de la table (devant chaque champ par exemple), mais juste son alias.

    ced

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

Discussions similaires

  1. Probleme de Jointure imbriqué sur plusieurs tables
    Par cana13 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 18/06/2009, 15h44
  2. Jointures imbriquées et jointures normales
    Par knowl dans le forum Développement
    Réponses: 5
    Dernier message: 24/10/2008, 23h44
  3. Pb de jointures imbriquées
    Par benjiiim dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/01/2008, 14h19
  4. Probleme de Jointures imbriquées dans une requête
    Par Crevin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/04/2005, 11h05
  5. Jointure externe compliquée
    Par miniil dans le forum Langage SQL
    Réponses: 9
    Dernier message: 19/02/2004, 09h27

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