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 23/08/2011, 10h25   #1
Provisoirement toléré
 
Inscription : juillet 2002
Messages : 187
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 187
Points : 32
Points : 32
Envoyer un message via AIM à psgman113 Envoyer un message via MSN à psgman113
Par défaut multiple count avec condition

Bonjour,


J'ai des objets formation, salle et professeur.
Une formation a 0 ou plusieurs salles.
Une formation a 0 ou plusieurs professeurs.

Table formation (id,nom,lieu)
Table formation_salle(id, id_formation, id_salle, actif)
Table formation_professeur(id, id_formation, id_professeur, actif)


Je veux récupérer la liste des formations qui appartiennent à un lieu donné
avec le nombre de salles rattachées actifs ainsi que le nombre de professeurs rattachés actifs.

J'ai du mal à faire ceci en 1 seule requête. J'ai tenté ceci mais je ne sais pas où mettre les conditions sur le champ actif (qui doit etre égale à 1) des 2 tables d'association.

Code :
1
2
3
4
5
6
7
 
SELECT formation.id, formation.lieu , COUNT ( f_s.id_formation),  COUNT ( f_p.id_formation)
FROM formation
LEFT JOIN formation_salle f_s
LEFT JOIN formation_professeur f_p
WHERE formation.lieu ='X'
GROUP BY formation.id

Merci beaucoup.
psgman113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 10h51   #2
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Je te propose ceci:
Code :
1
2
3
4
5
6
7
 
SELECT F.id, F.nom, COUNT (DISTINCT FS.id) AS nbSalle, COUNT(DISTINCT FP.id) AS nbProf
FROM formation F
INNER JOIN formation_salle FS ON FS.formation_id = F.id AND FS.actif = 1
INNER JOIN formation_professeur FP ON FP.formation_id = F.id AND FP.actif = 1
WHERE lieu = 'lieu'
GROUP F.id

Dans des LEFT JOIN ou INNER JOIN il te faut des conditions!
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 11h27   #3
Provisoirement toléré
 
Inscription : juillet 2002
Messages : 187
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 187
Points : 32
Points : 32
Envoyer un message via AIM à psgman113 Envoyer un message via MSN à psgman113
Très bien Merci.
Il faut juste laisser LEFT JOIN au lieu des INNER JOIN
car une formation peut avoir 0 salle ou 0 professeur et dans ce cas je veux les récupérer.
psgman113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 11h31   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par David55 Voir le message
Je te propose ceci:
Code :
1
2
3
4
5
6
7
 
SELECT F.id, F.nom, COUNT (DISTINCT FS.id) AS nbSalle, COUNT(DISTINCT FP.id) AS nbProf
FROM formation F
INNER JOIN formation_salle FS ON FS.formation_id = F.id AND FS.actif = 1
INNER JOIN formation_professeur FP ON FP.formation_id = F.id AND FP.actif = 1
WHERE lieu = 'lieu'
GROUP F.id
Le problème avec cette requête, c'est que si une formation est associée à une salle, mais qu'aucun formateur n'ait été affecté encore (ce qui est possible vu sa relation 0-n), vous perdrez l'information.
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/08/2011, 11h31   #5
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Vous avez été plus prompt que moi à poster !
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 12h00   #6
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Effectivement, erreur de ma part, il faut mettre des LEFT JOIN et non des INNER JOIN!

Ce qui donne en fin de compte la requête suivante:
Code :
1
2
3
4
5
6
7
 
SELECT F.id, F.nom, COUNT (DISTINCT FS.id) AS nbSalle, COUNT(DISTINCT FP.id) AS nbProf
FROM formation F
LEFT JOIN formation_salle FS ON FS.formation_id = F.id AND FS.actif = 1
LEFT JOIN formation_professeur FP ON FP.formation_id = F.id AND FP.actif = 1
WHERE lieu = 'lieu'
GROUP F.id
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 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 16h29.


 
 
 
 
Partenaires

Hébergement Web