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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 :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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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):
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Si une âme charitable a une suggestion ou une piste, je suis preneur.
Merci d'avance![]()
Partager