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 25/04/2011, 19h26   #1
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Âge : 19

Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 16
Points : 16
Par défaut Requete sql qui marche à moitié

Bonjour à tout le monde,
Ma requête sql marche à moitié :
Je vous expliques :
Bonjour, j'ai un petit problème de requete, Je vous explique :

Je dispose de 3 tables :
Une table FAMILLE(cdFam,nomFam,adFam,...)
Une table STAGE(cdStage,dateStage,...)
Une table PARTICIPATION_FAMILLE(cdFam,cdStage,nbStagiaires)

Une famille peut participer à plusieurs stage et possède un nombre de stagiaire pour ceux ci

Et je voudrais lister toutes les familles avec le nombre de stagiaires qu'elle prennent pour les stages numero 1 et numero 3

Je fais donc la requete suivante avec 2 jointures externe:

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT f.cdFam AS codeFam,
f.nomFam AS famille,
f.adFam AS adresse,
IFNULL(pfJ.nbStagiaire,'0') AS nbStagiaireJuillet,
IFNULL(pfA.nbStagiaire,'0') AS nbStagiaireAout
FROM famille f 
LEFT JOIN participation_famille pfJ ON pfJ.cdFam=f.cdFam 
LEFT JOIN participation_famille pfA ON pfA.cdFam=f.cdFam 
WHERE 
(pfJ.cdStage=1 OR pfJ.cdStage IS NULL)
AND (pfA.cdStage=3 OR pfA.cdStage IS NULL)
La requete m'affiche ceux qui participent au stage 1 et 2 et aussi les familles qui ne participent pas au stage mais bizarrement pas ceux qui ne participent qu'a un seul des deux stages !
J'arrive pas à comprendre ?!

Avez vous une idée ?
Merci d'avance
lagra007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 20h06   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
salut,

essaye de changer le and de ton where entre les 2 conditions qui doit être un or pour que ça renvoie l'un ou l'autre
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 20h19   #3
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Âge : 19

Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 16
Points : 16
Oui, ça donne le bon résultat mais la requête liste en double des familles
Par exemple une famille qui participe au stage 1 et 3
apparait 3 fois une fois pour le stage 1, un fois pour le stage 3 et une fois pour le stage 1 et 3
lagra007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 20h26   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
en supprimant les parties avec is null ça donne quoi?

au fait pourquoi tu mets pas ces conditions chacune au niveau de tes jointures plutôt que dans le where?
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 20h33   #5
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Âge : 19

Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 16
Points : 16
la même chose mais sans les familles qui ne participent à aucun des 2 stages
lagra007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 20h36   #6
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
vu que chacun des groupes de condition correspond à une des jointure ça devrait être rajouter avec un and dans la condition de la jointure visée

à savoir qu'un outer join génère des lignes supplémentaires pour chaque partie d'une la jointure qui génère un résultat de plus d'une ligne
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 20h40   #7
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Âge : 19

Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 16
Points : 16
Si je fait dans le WHERE
pfJ.cdStage=1 AND pfA.cdStage=3
Il va me lier que les familles qui participent aux stages 1 et 3
lagra007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 20h44   #8
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
non avec or

Code :
1
2
3
4
5
6
7
8
9
10
SELECT f.cdFam AS codeFam,
f.nomFam AS famille,
f.adFam AS adresse,
IFNULL(pfJ.nbStagiaire,'0') AS nbStagiaireJuillet,
IFNULL(pfA.nbStagiaire,'0') AS nbStagiaireAout
FROM famille f 
LEFT JOIN participation_famille pfJ ON pfJ.cdFam=f.cdFam 
LEFT JOIN participation_famille pfA ON pfA.cdFam=f.cdFam 
WHERE 
pfJ.cdStage=1 OR pfA.cdStage=3
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 20h45   #9
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Âge : 19

Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 16
Points : 16
Je ne comprends pas trés bien le principe de OUTER JOIN ?

Si je mets la même chose dans le WHERE mais avec un OR, ça me liste toutes le familles qui participent à des stages et en triple apr exmple ceux qui participent au 1, 3 et 1,3
lagra007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 20h49   #10
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
"left join" c'est en fait "left outer join"

en fait, ça équivaut à ça:

Code :
1
2
3
4
5
6
7
8
SELECT f.cdFam AS codeFam,
f.nomFam AS famille,
f.adFam AS adresse,
IFNULL(pfJ.nbStagiaire,'0') AS nbStagiaireJuillet,
IFNULL(pfA.nbStagiaire,'0') AS nbStagiaireAout
FROM famille f 
LEFT JOIN participation_famille pfJ ON pfJ.cdFam=f.cdFam AND pfJ.cdStage=1
LEFT JOIN participation_famille pfA ON pfA.cdFam=f.cdFam AND pfA.cdStage=3
le where normalement limite le nombre de lignes que tu sors, par exemple en limitant ta recherche à une famille particulière...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/04/2011, 20h57   #11
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Âge : 19

Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 16
Points : 16
Purée mais ça marche !!!
Je ne savais pas qu'on devait mettre la restriction de jointure dans le JOIN
J'avais l'habitude avec oracle de faire la jointure dans le WHERE avec un (+) à droite si LEFT JOIN ou a gauche si RIGHT JOIN et la condition sur ces jointure dans le where, mais apparement avec cette syntaxe la condition ce mets dans le JOIN ! et si jamais je la mets dans le WHERE ça deconne ! :p

Coule Alors !

Merci !!!!!!!!!!
lagra007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 21h09   #12
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
tu peux faire ça sur tous les sgbd normalement vu que c'est une écriture ansi...

ta condition de jointure ne porte donc pas forcément sur un seul critère...

tout ce qu'il y a entre le "on" et la déclaration d'une autre jointure ou d'un where éventuelle affectera la jointure en cours donc.

de rien
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h54.


 
 
 
 
Partenaires

Hébergement Web