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 12/01/2012, 11h02   #1
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 0
Points : 0
Par défaut COUNT et jointure externe

Bonjour,

Je travaille actuellement sur un projet ou 2 tables 'Produit' et 'Contrat', liées par une clé secondaire dans 'Contrat' et j'essaye d'obtenir une table comprenant tous les champs de ces deux tables, mais également le nombre de contrats liés à chaque produit.

Je travaille sur Windev, avec du MySQL

Voila la structure des tables :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE Produit
(
IdProduit,
NomProduit,
Prix,
PRIMARY KEY (IdProduit)
);
 
CREATE TABLE Contrat
(
IdContrat,
IdProduit,
DateContrat,
PRIMARY KEY (IdContrat),
FOREIGN KEY (IdProduit) REFERENCES Produit(IdProduit)
);

Le resultat que j'aimerai obtenir est du type

NomProduit     l     Prix      l     nbContrats
--------------------------------------------
LogiBat          l     200€     l       4
EducaCiel       l     150€     l       3
Softobinz       l     300€     l       0
DevServeur    l     100€     l       0
La premiere requête que j'ai testée pose un probleme au niveau de la jointure entre les tables : les produits qui ne sont pas liés a un contrat n'apparaissent pas :

Code :
1
2
3
4
  SELECT Produit.IDProduit, Produit.NOMPRODUIT, Produit.PRIX, COUNT(*) AS NBCONTRATS 
    FROM Produit, Contrat 
   WHERE Produit.idproduit=contrat.idproduit
GROUP BY IDPRODUIT, NOMPRODUIT, PRIX

Apres quelques recherche, je me suis orienté sur les jointures externes (élément que je n'ai jamais manié auparavent)
J'ai donc réussi a afficher les produits sans contrats, mais le COUNT ne me renvoie pas la bonne valeur pour ces produits (1 au lieu de 0):

Code :
1
2
3
4
  SELECT Produit.IDProduit, Produit.NOMPRODUIT, Produit.PRIX, COUNT(*) AS NBCONTRATS 
    FROM Produit, Contrat
         RIGHT OUTER JOIN Contrat ON Contrat.Idproduit = Produit.Idproduit
GROUP BY IDPRODUIT, NOMPRODUIT, PRIX
Je vois a peu pres d'ou vient le probleme (le count compte les tuples, meme si ils ne sont pas liés) mais je ne vois pas comment le résoudre.

Si une âme charitable a une suggestion ou une piste, je suis preneur.
Merci d'avance
Bobotaku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 11h10   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par Bobotaku Voir le message
Je vois a peu pres d'ou vient le probleme (le count compte les tuples, meme si ils ne sont pas liés) mais je ne vois pas comment le résoudre.
Tout à fait, c'est bien ce qui se passe. Mais ce n'est pas count qui compte les tuples, c'est count(*).
Pour résoudre, on compte sur une colonne non nulle de la table jointe, un excellent choix c'est la clef primaire.
Attention toute fois, votre jointure externe est dans le mauvaise sens :
Code :
1
2
3
4
5
6
  SELECT Prd.IDProduit, Prd.NOMPRODUIT, Prd.PRIX
       , COUNT(Cnt.IdContrat) AS NbContrats 
    FROM Produit AS Prd
         LEFT OUTER JOIN Contrat AS Cnt
           ON Cnt.Idproduit = Prd.Idproduit
GROUP BY Prd.IDProduit, Prd.NOMPRODUIT, Prd.PRIX
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 11h26   #3
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 0
Points : 0
Wow ! Merci beaucoup Waldar, ça marche impec !
ça me simplifie vraiment la vie pour le reste du code.

Mes profs m'ont tjs dit que les 99% des COUNT sont des COUNT (*) du coup j'ai même pas réfléchi à ce parametre.

You're the best
Bobotaku 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 23h12.


 
 
 
 
Partenaires

Hébergement Web