Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/10/2011, 18h14   #1
Membre du Club
 
Inscription : janvier 2008
Messages : 706
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 706
Points : 66
Points : 66
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 :
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.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 18h37   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
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.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 12h19   #3
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

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

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
C'est une salade au thon


tu peux mettre ça

Code :
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"
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 04/10/2011, 13h58   #4
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

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

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,


Code :
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.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 04/10/2011, 15h50   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/10/2011, 18h00   #6
Membre du Club
 
Inscription : janvier 2008
Messages : 706
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 706
Points : 66
Points : 66
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.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 18h45   #7
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
Donc un truc du genre:
Code SQL :
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.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 21h34   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 23h21   #9
Membre du Club
 
Inscription : janvier 2008
Messages : 706
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 706
Points : 66
Points : 66
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 :
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.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 09h13   #10
Membre du Club
 
Inscription : janvier 2008
Messages : 706
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 706
Points : 66
Points : 66
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 :
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.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 09h14   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Citation:
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 :
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 09h48   #12
Membre du Club
 
Inscription : janvier 2008
Messages : 706
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 706
Points : 66
Points : 66
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.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 10h07   #13
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

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

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
kate59, peux tu nous donner le resultat que tu veux avoir?
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 10h46   #14
Membre du Club
 
Inscription : janvier 2008
Messages : 706
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 706
Points : 66
Points : 66
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.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 10h52   #15
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
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 :
Citation:
Code :
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.

Citation:
Code :
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 :
INSERT INTO `associer_groupe` VALUES (2, 1);
Le membre 2 a aussi créé le groupe 1.

Citation:
Code :
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 :
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 :
Citation:
Code :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/10/2011, 11h09   #16
Membre du Club
 
Inscription : janvier 2008
Messages : 706
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 706
Points : 66
Points : 66
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 :
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.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 11h25   #17
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Je viens de te dire que ta solution ne peut pas fonctionner !
Citation:
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 11h41   #18
Membre du Club
 
Inscription : janvier 2008
Messages : 706
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 706
Points : 66
Points : 66
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.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h05   #19
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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).
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 17h31   #20
Membre du Club
 
Inscription : janvier 2008
Messages : 706
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 706
Points : 66
Points : 66
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 :
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.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h24.


 
 
 
 
Partenaires

Hébergement Web