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 :

Jointures complexes


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut Jointures complexes
    Bonjour,

    voila j'ai deux tables avec deux associations qui les relient :

    table membre reliée à table associer et cette table reliée à un groupe.
    table membre reliée à table groupe_membre et cette table reliée à un groupe.

    voici ma jointure mais je n'arrive pas a faire la deuxième partie j'ai une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT *
    FROM groupe_membre, associer_groupe, groupe_ovip, membre_ovip
    INNER JOIN groupe_ovip ON groupe_membre.ref_groupe = groupe_ovip.id_groupe
    INNER JOIN membre_ovip ON groupe_membre.ref_membre = membre_ovip.id_membre
    INNER JOIN groupe_ovip ON associer_groupe.ref_groupe = groupe_ovip.id_groupe
    INNER JOIN membre_ovip ON associer_groupe.ref_membre = membre_ovip.id_membre
    WHERE groupe_ovip.id_groupe = "1"

    - Not unique table/alias: 'groupe_ovip'


    merci de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Tu dois mettre un alias sur les tables que tu utilises 2 fois dans ta requête.
    D'ailleurs je trouve que tu as une façon bizarre d'écrire ta requête: une liste de table dans le from, puis des inner join... sur les mêmes tables.

    Tatayo.

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    C'est une salade au thon


    tu peux mettre ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT *
    FROM groupe_membre A, 
    associer_groupe B, 
    groupe_ovip C, 
    membre_ovip D
    where  
    AND A.ref_groupe = C.id_groupe
    AND  A.ref_membre = D.id_membre
    AND  B.ref_groupe = C.id_groupe
    AND B.ref_membre = D.id_membre
    AND C.id_groupe = "1"
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    Bonjour,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT *
    FROM            groupe_membre   t1 
         INNER JOIN groupe_ovip     t2 ON  t1.ref_groupe = t2.id_groupe
         INNER JOIN membre_ovip     t3 ON  t1.ref_membre = t3.id_membre
         INNER JOIN associer_groupe t4 ON  t4.ref_groupe = t2.id_groupe 
                                       AND t4.ref_membre = t1.id_membre    
    WHERE t3.id_groupe = "1"
    Fais quand même un tour sur les tutos SQL
    Cordialement.

  5. #5
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    En évitant la guerre des étoiles et en supprimant les guillemets autour de la valeur numérique (j'ose espérer que cet identifiant est bien de type entier ?), ce sera encore mieux. Je changerais aussi l'ordre des tables pour éviter de pointer sur deux tables dans la même jointure et j'utiliserais des alias plus mnémotechniques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT -- les colonnes nécessaires et pas étoile !
    FROM associer_groupe ag
    INNER JOIN groupe_membre gm ON ag.ref_membre = gm.id_membre
        INNER JOIN membre_ovip mo ON gm.ref_membre = mo.id_membre
    INNER JOIN groupe_ovip go ON ag.ref_groupe = go.id_groupe
    WHERE mo.id_groupe = 1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    j'ai essayé votre code mais ça ne me retourne rien, j'aurai du m'expliquer un peu mieux, voila j'ai

    table membre reliée à table associer et cette table reliée à un groupe.
    table membre reliée à table groupe_membre et cette table reliée à un groupe.

    la table associer enregistre les membres qui ont créé des groupes.

    la table groupe_membre enregistre les membres qui sont contenus dans certains des groupes créés.

    je voudrais récupérer toutes les informations des membres qui appartiennent au groupe 1 et dont le groupe a été créer par le membre 120.

    membre 0.n groupe_membre 0.n groupe (appartient au groupe)
    membre 0.n associer_membre 0.n groupe (creer le groupe)

    merci.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Donc un truc du genre:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select m1.id
    from membre m1
    inner join groupe_membre as gm on gm.idmembre = m1.id
    inner join groupe as g1 on g1.id = cm.idgroupe
    inner join associer as a1 on a1.idgroupe = g1.id
    inner join membre m2 on m2.id = associer.idmembre
    where g1.numero = 1 and m2.numero = 120

    Les deux premières jointures pour le lien entre les membres et leurs groupes, et les deux dernières pour le créateur du groupe.

    Tatayo.

  8. #8
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par kate59 Voir le message
    la table associer enregistre les membres qui ont créé des groupes.

    membre 0.n associer_membre 0.n groupe (creer le groupe)
    Ça veut dire qu'un groupe peut être créé par plusieurs membres ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    rebonsoir,

    rien ne fonctionne voici le code SQL si ça peut aider.
    donc:
    un groupe peut être créé par 0 ou plusieurs membres
    1 membre peut créer 0 ou + plusieurs groupes
    1 groupe peut être situé dans 0 ou + membres
    1 membre peut être situé dans 0 ou + groupes.

    Pour expliquer cette histoire d'un groupe qui peut être créé pour 0 ou + plusieurs membres et pas par un seul, j'ai du faire car 2 groupes de base amis, famille doivent être situés dans base dans chaque messagerie des membres.

    merci j’espère que ça pourra aider, j'ai essayé toute la soirée, et pas reçu ce que je voulais.
    voici pour groupe:
    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
    CREATE TABLE `groupe` (
      `id_groupe` int(11) NOT NULL auto_increment,
      `nom_groupe` varchar(255) NOT NULL,
      `description_groupe` text,
      PRIMARY KEY  (`id_groupe`)
    ) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=latin1 AUTO_INCREMENT=121 ;
     
    -- 
    -- Contenu de la table `groupe`
    -- 
     
    INSERT INTO `groupe` VALUES (1, 'Amis', 'Liste des amis');
    INSERT INTO `groupe` VALUES (3, 'Relations', 'Liste des relations');
     
    INSERT INTO `groupe` VALUES (45, 'm', 'm');
    INSERT INTO `groupe` VALUES (46, 'm', 'm');
     
    voici pour membre:
    CREATE TABLE `membre` (
      `id_membre` int(11) unsigned NOT NULL auto_increment,
      `activer_membre` tinyint(1) unsigned default '0',
      `type_membre` varchar(255) NOT NULL,
      ...
      PRIMARY KEY  (`id_membre`)
    ) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=latin1 AUTO_INCREMENT=105 ;
     
    -- 
    -- Contenu de la table `membre`
    -- 
     
    INSERT INTO `membre` VALUES (1, 1, '', '', 315623456, 'Web', 'gaborit', 'elodie', 'kate', 'perpignan', 'elodie@gmail.com', '1987-09-30', 'homme', 'celibataire', 'oo', 'perpignan', 66100, '06857824', 1030, 'a vos clavier...', '2011-09-28 15:55:24', '2011-09-28 15:55:24', 'Fotolia_9495290_XS.jpg', NULL);
     
    groupe_membre:
    CREATE TABLE `groupe_membre` (
      `ref_membre` int(11) unsigned NOT NULL,
      `ref_groupe` int(11) NOT NULL,
      PRIMARY KEY  (`ref_membre`,`ref_groupe`),
      KEY `ref_membre` (`ref_membre`),
      KEY `ref_groupe` (`ref_groupe`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- 
    -- Contenu de la table `groupe_membre`
    -- 
     
    INSERT INTO `groupe_membre` VALUES (1, 3);
    INSERT INTO `groupe_membre` VALUES (1, 109);
    ...
    CREATE TABLE `associer_groupe` (
      `ref_membre` int(11) unsigned NOT NULL,
      `ref_groupe` int(11) NOT NULL,
      PRIMARY KEY  (`ref_membre`,`ref_groupe`),
      KEY `ref_membre` (`ref_membre`),
      KEY `ref_groupe` (`ref_groupe`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
     
    -- 
    -- Contenu de la table `associer_groupe`
    -- 
     
    INSERT INTO `associer_groupe` VALUES (1, 1);
    INSERT INTO `associer_groupe` VALUES (1, 3);



    Merci encore pour l'aide.

  10. #10
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    bonjour,

    merci encore pour votre aide je pense qu'il doit manquer un petit truc en fait j'ai un espace membre pour les visiteurs dedans les membres peuvent créer un groupe ex:relation, travail.. et de base ils sont le groupe amis et famille par défaut déjà mis.

    donc je voudrais que si un client sélectionne dans la liste des groupes qu'il a créé (association associer_groupe) un groupe la liste des membres qui appartiennent à ce groupe (association groupe_membre) s'affiche.

    donc là on a bien indiqué que seuls ceux du groupe 3 doivent s'afficher mais on a pas indiqué en plus que ce doit être les groupes créé par le membre 120.

    j'ai fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT m.id_membre,m.nom_membre
    FROM `groupe_membre` AS `gm` 
    INNER JOIN `membre` AS `m` ON `gm`.`ref_membre` = `m`.`id_membre`
    INNER JOIN `groupe` AS `g` ON `gm`.`ref_groupe` = `g`.`id_groupe`
    LEFT JOIN `associer_groupe` AS `a` ON `m`.`id_membre` = `a`.`ref_membre` AND `g`.`id_groupe` = `a`.`ref_membre` AND `a`.`ref_membre` = 1
    WHERE `gm`.`ref_groupe` = 120
    and `a`.`ref_membre` = 102



    mais il me retourne aucun résultat alors que j'ai bien dans associer_groupe(102,1)et dans groupe_membre (2,120).

    je ne comprend pas merci encore si on arrive à trouver ça, ça serait génial.

  11. #11
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    je voudrais récupérer toutes les informations des membres qui appartiennent au groupe 1 et dont le groupe a été créer par le membre 120.
    Quels sont les membres du groupe 1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT m.id_membre, m.activer_membre, m.type_membre -- et autres colonnes si besoin
    FROM membre m
    INNER JOIN groupe_membre gm ON gm.ref_membre = m.id_membre
    WHERE gm.ref_groupe = 1
    Quels sont ceux dont le groupe a été créé par le membre 120 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT m.id_membre, m.activer_membre, m.type_membre -- et autres colonnes si besoin
    FROM membre m
    INNER JOIN groupe_membre gm ON gm.ref_membre = m.id_membre
        INNER JOIN associer_groupe ag ON ag.ref_groupe = gm.ref_groupe
    WHERE gm.ref_groupe = 1
        AND ag.ref_membre = 120
    Quelques remarques complémentaires...
    1) Dans ta description des tables, je ne vois pas les clés étrangères.
    Ce serait dommage d'utiliser le moteur InnoDB et ne pas profiter des clés étrangères.

    2) Des données de la table membre devraient être externalisées.
    Même si tu ne nous as pas donné la structure complète de la table, je devine, à la requête d'insertion, qu'il y aura sans doute plusieurs fois "web", "Perpignan", "Homme", "Célibataire" et peut être encore d'autres colonnes dont je n'ai pas compris la signification. Toutes ces données devraient figurer dans des tables de référence "sexe", "ville", "situation_familiale" et il ne devrait y avoir dans la table membre que les clés étrangères référençant les identifiants de ces tables de référence.

    3) Comment fais-tu pour différencier les amis de X des amis de Y puisque tout le monde a finalement le même groupe "amis" ?

    4) L'index sur ref_membre dans les tables associatives est inutile puisque c'est la première colonne de la clé primaire.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #12
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    rebonjour,

    je pense que je dois vraiment avoir un problème dans ces tables pouvez vous m'aider comme j'ai expliqué,

    je devais mettre deux groupes amis et famille de base reliés au membre donc en gros j'ai rajouter une association(associer_groupe) qui permet enregistrer référence du membre qui a créé ce groupe mais ayant deux groupe de base il pouvait y avoir comme enregistrement ref_membre et ref_groupe comme ceci car un groupe ne pouvait plus être unique pour chaque membre à cause de cette contrainte:
    (1,1)(1,2)(2,1)(2,2)

    et j'ai rajouté une association pour enregistrer les membres qui composent ce groupe.

    j’espère que vous comprendrez donc là je pense que le problème est bien moi je recherche à afficher les membre qui composent le groupe ex:1 mais dont le membre qui l'a créé et le ex:20.

    donc là il m'affiche bien les membres de ce groupe mais pas du membre qui l'a de base.

    merci de votre aide.

  13. #13
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    kate59, peux tu nous donner le resultat que tu veux avoir?
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  14. #14
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    je voudrai obtenir le nom, le prénom, le pseudo des membres qui composent le groupe ex 10 et qui a été créé par le membre ex 21.

    merci.

  15. #15
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ce que tu ne comprends pas Kate59, c'est que tu as un problème d'architecture de données.

    Je reprends tes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE `groupe` (
      `id_groupe` int(11) NOT NULL AUTO_INCREMENT,
      `nom_groupe` varchar(255) NOT NULL,
      `description_groupe` text,
      PRIMARY KEY  (`id_groupe`)
    ) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=latin1 AUTO_INCREMENT=121 ;
     
    -- 
    -- Contenu de la table `groupe`
    -- 
     
    INSERT INTO `groupe` VALUES (1, 'Amis', 'Liste des amis');
    INSERT INTO `groupe` VALUES (3, 'Relations', 'Liste des relations');
    On est bien d'accord qu'il n'y a qu'un seul groupe d'amis et qu'un seul groupe de relations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE `associer_groupe` (
      `ref_membre` int(11) UNSIGNED NOT NULL,
      `ref_groupe` int(11) NOT NULL,
      PRIMARY KEY  (`ref_membre`,`ref_groupe`),
      KEY `ref_membre` (`ref_membre`),
      KEY `ref_groupe` (`ref_groupe`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
     
    -- 
    -- Contenu de la table `associer_groupe`
    -- 
     
    INSERT INTO `associer_groupe` VALUES (1, 1);
    INSERT INTO `associer_groupe` VALUES (1, 3);
    Le membre 1 a créé les groupes 1 et 3. Mais si j'ai bien compris, tu pourrais aussi avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `associer_groupe` VALUES (2, 1);
    Le membre 2 a aussi créé le groupe 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE `groupe_membre` (
      `ref_membre` int(11) UNSIGNED NOT NULL,
      `ref_groupe` int(11) NOT NULL,
      PRIMARY KEY  (`ref_membre`,`ref_groupe`),
      KEY `ref_membre` (`ref_membre`),
      KEY `ref_groupe` (`ref_groupe`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- 
    -- Contenu de la table `groupe_membre`
    -- 
     
    INSERT INTO `groupe_membre` VALUES (1, 3);
    INSERT INTO `groupe_membre` VALUES (1, 109);
    Le membre 1 fait partie des groupes 3 et 109. Mais tu peux aussi avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `groupe_membre` VALUES (12, 1);
    INSERT INTO `groupe_membre` VALUES (25, 1);
    Les membres 12 et 25 font partie du groupe 1.
    Et comme il n'y a qu'un groupe 1 qui est le groupe des amis, tu ne peux pas savoir si ce sont les amis du membre 1 ou du membre 2.

    1ère solution :
    Tu supprimes la table associative associer_groupe et tu ajoutes dans la table groupe la clé étrangère référençant le créateur du groupe.
    Conséquence : tu auras plusieurs groupes qui porteront le même nom, par exemple "Amis", mais ce n'est pas gênant car ce ne sont pas réellement les mêmes groupes, l'un sera en fait "amis de X" et l'autre "amis de Y". D'ailleurs, l'exemple de données que tu as donné montre que c'est déjà le cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `groupe` VALUES (45, 'm', 'm');
    INSERT INTO `groupe` VALUES (46, 'm', 'm');
    Les groupes 45 et 46 s'appellent tous les deux "m" !

    2ème solution :
    Tu ajoutes dans la table membre_groupe l'identifiant du créateur du groupe.
    C'est à dire qu'en réalité, tu ne fais pas référence au groupe mais au couple représenté dans assoicier_groupe.

    Perso, je préfère la première car peut-être que le membre X voudra appeler son groupe d'amis non pas "amis" mais "potes" ou "copains" ou "friends"...
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  16. #16
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    merci de te pencher sur mon problème voila la 1 ère solution je l'avais déjà adaptée au site mais j'ai eu un problème car pour avoir les groupe amis et famille de base dans les messageries relie au membre lors de leur validation d'email, je les active et j'enregistre ces groupes déjà créés au nouveau membre mais voila j'avais besoin des id fixe des groupes pour faire ça :
    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
    $groupe1 = new AssocierGroupe (
    		array (
    		'ref_membre' => $id_membre,
    		'ref_groupe' => "1"
    		)
    		);
     
    	$groupe2 = new AssocierGroupe (
    		array (
    		'ref_membre' => $id_membre,
    		'ref_groupe' => "3"
    		)
     
    		);
     
    $managerAssocierGroupe->saveAssocierGroupe($groupe1);
    $managerAssocierGroupe->saveAssocierGroupe($groupe2);
    donc ceci me permet d’enregistrer le groupe amis et famille de base, je n'ai pas trouvé d'autre moyen sinon j'aurais gardé la 1 ère solution qui me paraissait aussi logique mais plus dans ce cas.

    à part si tu avais une autre solution pour moi ?
    MERCI.

  17. #17
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je viens de te dire que ta solution ne peut pas fonctionner !
    a part si tu aurai une autre solution pou rmoi?
    Je t'en ai proposé deux autres en t'expliquant qu'en réalité tu as déjà avec ton modèle des groupes qui peuvent avoir le même nom donc pourquoi ne pas créer autant de groupes appelés "amis" qu'il y a d'utilisateurs ?
    Mais si tu préfères la seconde solution qui consiste à ajouter le créateur du groupe à la table membre_groupe, libre à toi.

    La seconde solution correspond à ce MCD :
    membre -1,n----creer----(1,1)- creation_groupe -(1,1)----associer----0,n- groupe
    |-------------0,n----participer----0,n------------|

    Tables :
    membre (id_membre...)
    groupe (id_groupe...)
    creation_groupe (ref_membre, ref_groupe)
    participation_groupe (ref_membre, ref_groupe, ref_createur)

    Dans la dernière table, tu auras une clé étrangère qui référence la clé primaire de la table "creation_groupe", c'est à dire le couple {ref_membre, ref_groupe} de "creation_groupe".
    Et "ref_membre" de "participation_groupe" référence "id_membre" de la table "membre".
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  18. #18
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    merci je vais regarder la 2ème solution car c'est vrai que s'il y a ex 200 membre ça va être alourdir la base pour rien je pense avec les groupes amis et famille.

    merci encore je vais regarder.

  19. #19
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    1ère solution :
    Tu supprimes la table associative associer_groupe et tu ajoutes dans la table groupe la clé étrangère référençant le créateur du groupe.
    ...
    Perso, je préfère la première car peut-être que le membre X voudra appeler son groupe d'amis non pas "amis" mais "potes" ou "copains" ou "friends"...
    Moi aussi je préfère la 1ere solution.
    Il faut rajouter un index unique sur le couple (nom_groupe,id_creator).

  20. #20
    Membre habitué
    Inscrit en
    Janvier 2008
    Messages
    1 159
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 159
    Points : 149
    Points
    149
    Par défaut
    bonjour,

    voila j'ai créer la table mais j'ai cette erreur:
    Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '110-105' for key 1
    voici la table:
    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
    CREATE TABLE `groupe_membre` (
      `ref_membre` int(11) unsigned NOT NULL,
      `ref_groupe` int(11) NOT NULL,
      `ref_createur` int(11) unsigned NOT NULL,
      PRIMARY KEY  (`ref_membre`,`ref_groupe`),
      KEY `ref_membre` (`ref_membre`),
      KEY `ref_groupe` (`ref_groupe`),
      KEY `ref_createur` (`ref_createur`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- 
    -- Contenu de la table `groupe_membre`
    -- 
     
    INSERT INTO `groupe_membre` VALUES (1, 3, 1);
    INSERT INTO `groupe_membre` VALUES (1, 109, 1);
    INSERT INTO `groupe_membre` VALUES (1, 114, 1);
    INSERT INTO `groupe_membre` VALUES (2, 105, 1);
    INSERT INTO `groupe_membre` VALUES (2, 111, 1);
    INSERT INTO `groupe_membre` VALUES (2, 120, 1);
    INSERT INTO `groupe_membre` VALUES (2, 122, 1);
    INSERT INTO `groupe_membre` VALUES (6, 1, 1);
     
     
    -- 
    ALTER TABLE `groupe_membre`
      ADD CONSTRAINT `groupe_membre_ibfk_2` FOREIGN KEY (`ref_groupe`) REFERENCES `associer_groupe` (`ref_groupe`) ON DELETE CASCADE ON UPDATE CASCADE,
      ADD CONSTRAINT `groupe_membre_ibfk_4` FOREIGN KEY (`ref_membre`) REFERENCES `membre_ovip` (`id_membre`) ON DELETE CASCADE ON UPDATE CASCADE,
      ADD CONSTRAINT `groupe_membre_ibfk_5` FOREIGN KEY (`ref_createur`) REFERENCES `associer_groupe` (`ref_membre`) ON DELETE CASCADE ON UPDATE CASCADE;

    merci.

Discussions similaires

  1. Requete avec jointure complexe
    Par chjerome dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/05/2008, 16h53
  2. [BO 6.5] Jointure complexe et tables dérivées
    Par tegestobis dans le forum Designer
    Réponses: 9
    Dernier message: 09/01/2008, 14h21
  3. Requête : Jointure Complexe
    Par xwawa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/03/2006, 10h10
  4. [MySQL 4.0.15] Jointure complexe
    Par Carter dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/02/2006, 14h31
  5. Auto jointure complexe
    Par ricobye dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/01/2006, 16h02

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