Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 02/08/2011, 09h35   #1
Invité régulier
 
Inscription : mai 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 18
Points : 6
Points : 6
Par défaut Requête table d'association

Bonjour,

je suis en train de concevoir une interface utilisant une base de données mysql.

Je possède trois tables. Une table molécule, groupe et une table d'association groupe_molecule.
Une molecule peut appartenir à un groupe et un groupe peut posséder 1 ou plusieurs molécules.

Structure : Molecule (id_molecule, nom_molecule)
groupe (id_groupe,nom_groupe)
groupe_molecule (id_groupe,id_molecule)


Mon problème : j'ai un groupe groupe_test contenant x molécule(s)
Voila j'aimerais savoir s'il existe une requête qui permet de savoir s'il existe déjà un tel groupe contenant les mêmes molecules que groupe_test.

Merci d'avance.
Timbermatt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 10h00   #2
Invité régulier
 
Inscription : mai 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 18
Points : 6
Points : 6
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT * 
FROM `groupe_molecule` AS groupe_mol
WHERE EXISTS (
 
SELECT * 
FROM groupe_molecule AS groupe_mol2
WHERE groupe_mol2.id_groupe_molecule != groupe_mol.id_groupe_molecule AND groupe_mol.id_molecule = groupe_mol2.id_molecule
AND groupe_mol2.id_groupe =14
)
AND id_groupe!=14
LIMIT 0 , 30
Voilà j'ai essayé une requête dans ce genre-là mais je ne suis vraiment pas sûr de moi sur ce coup-là.
En sachant que le groupe 14 est le groupe que je cherche.
Timbermatt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 10h17   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 009
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 009
Points : 18 282
Points : 18 282
Envoyer un message via MSN à CinePhil
Quelles sont les molécules du groupe test ?
Code :
1
2
3
4
SELECT gm.id_molecule
FROM groupe_molecule gm
INNER JOIN groupe g ON g.id_groupe = gm.id_groupe
WHERE g.nom_groupe = 'groupe test'
Petite ambiguïté dans ta question :
Citation:
Voila j'aimerai savoir s'il existe une requete qui permet de savoir s'il existe déjà un tel groupe contenant les même molecule que groupe_test.
Faut-il que cet autre groupe ait :
1) Toutes les molécules de groupe test et seulement celles-là ?
2) Au moins toutes les molécules de groupe test ?
3) Au moins une des molécules de groupe test ?

Je vais supposer que c'est le 1.
On cherche donc un groupe dont les molécules font partie de celles de groupe test et dont le nombre de molécules est le même que celui de groupe test.
Essaie cette requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT g1.nom_groupe
FROM groupe g1
INNER JOIN groupe_molecule gm1 ON gm1.id_groupe = g1.id_groupe
  LEFT OUTER JOIN
  (
    SELECT gm.id_molecule
    FROM groupe_molecule gm
    INNER JOIN groupe g ON g.id_groupe = gm.id_groupe
    WHERE g.nom_groupe = 'groupe test'
  ) tmp ON tmp.id_molecule = gm1.id_molecule
WHERE g1.nom_groupe <> 'groupe test'
GROUP BY g1.nom_groupe
HAVING COUNT (gm1.id_molecule) = COUNT(tmp.id_molecule)
__________________
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 20
Vieux 02/08/2011, 11h01   #4
Invité régulier
 
Inscription : mai 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 18
Points : 6
Points : 6
Merci pour ta réponse rapide.

Effectivement c'est bien le cas 1 que je traite.

Et je te remercie cette requête fonctionne à merveille .

Par contre, j'aimerais bien une p'tite explication de la requête, car j'ai un peu de mal avec le LEFT OUTER JOIN.

En gros si j'comprends bien, tmp récupère toutes les molécules de groupe_test?
Timbermatt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 15h20   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 009
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 009
Points : 18 282
Points : 18 282
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Timbermatt Voir le message
Par contre, j'aimerais bien une p'tite explication de la requête, car j'ai un peu de mal avec le LEFT OUTER JOIN.
LEFT JOIN permet de prendre toutes les lignes de la table groupe_molecule.
WHERE limite ces lignes à celles qui ne concernent pas groupe test.

Citation:
En gros si j'comprends bien, tmp récupère toutes les molécules de groupe_test?
Oui, et donc la jointure externe est faite avec les molécules de groupe test.

On compare ensuite le nombre de molécules de groupe test avec le nombre de molécules des autres groupes sélectionnés et on ne conserve que ceux qui ont exactement les mêmes molécules que groupe test.

Imaginons la table groupe_molecule suivante dans laquelle groupe test porte l'identifiant 1 :
id_groupe / id_molecule
1 / 1
1 / 2
2 / 1
2 / 2
2 / 3
3 / 1
3 / 2

Il y a deux molécules (1 et 2) dans le groupe test.

La jointure va donner ceci :
id_groupe / id_molecule / id_molecule de groupe test
1 / 1 / 1
1 / 2 / 2
2 / 1 / 1
2 / 2 / 2
2 / 3 / NULL
3 / 1 / 1
3 / 2 / 2

La restriction (WHERE) excluant groupe test va réduire le résultat à ceci :
id_groupe / id_molecule / id_molecule de groupe test
2 / 1 / 1
2 / 2 / 2
2 / 3 / NULL
3 / 1 / 1
3 / 2 / 2

Le groupage par groupe et le comptage vont donner ceci :
id_groupe / nombre de molecules
2 / 3
3 / 2

Comme on impose que le nombre de molécules soit celui du groupe test, il ne reste que le groupe 3.
__________________
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 02/08/2011, 15h41   #6
Invité régulier
 
Inscription : mai 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 18
Points : 6
Points : 6
Merci beaucoup.
Timbermatt est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h10.


 
 
 
 
Partenaires

Hébergement Web