GROUP BY ou DISTINCT sur une requête complexe

GROUP BY ou DISTINCT sur une requête complexe - SQL/NoSQL - Programmation

Marsh Posté le 24-04-2006 à 14:24:18    

Bonjour,
 
J'ai une base qui stocke des produits sur lesquels on effectue des opérations. Ces opérations sont réalisées par différents utilisateurs dans des lieux différents. A un produit peut donc correspondre plusieurs opérations. A une opérations plusieurs utilisateurs et plusieurs lieux.
 
Les lieux sont stockés dans lieu table "Lieu_Produit" et reliés à la table "Produit" par une table intermédiaire qui a une clé primaire. Ce qui me permet d'entrer plusieurs lieux pour un produit.
Même système pour la table intermédiaire Produit_Operation qui relie Produit à Operation.
 
Je voudrais afficher toutes les opérations d'un produit. J'écris la requête que j'ai copié plus bas dans la page.
 
MON PROBLEME:
 
La requête me retourne chaque opération (et ses caractéristiques) repétée pour chaque lieu.
 
Par exemple si sur le produit "pdt1" on a fait l'opération "op1" à Bordeaux, "op2" à Caen et "op3" à Lille,  je vais avoir affiché:
 
op1 -> Bordeaux
op1 -> Caen
op1 -> Lille
 
op2 -> Bordeaux
op2 -> Caen
op2 -> Lille
 
op3 -> Bordeaux
op3 -> Caen
op3 -> Lille
 
 
Si maintenant j'enlève le distinct, c'est encore plus la merde parce que j'ai affiché 3 fois l'opération pour chaque lieu.
 
 
MA QUESTION:
 
Je suppose qu'il faut utiliser un GROUP BY, mais j'arrive pas à trouver le bon.
 
 
Merci de votre aide et du temps que vous prendrez à lire cette longue question!
 
MON CODE:
 
Voici ma requête (logée dans une fonction php):
 

Code :
  1. $scan_operations="SELECT DISTINCT Type_Operation.Id_Type_Operation,Type_Operation.Nom_Type_Operation,";
  2. $scan_operations.="Operation.Id_Operation,Operation.Commentaire_Operation,";
  3. $scan_operations.="Operation_Util.Id_Operation,Operation_Util.Id_Utilisateur,";
  4. $scan_operations.="Utilisateur.Id_Utilisateur,Utilisateur.Alias_Utilisateur,";   
  5. $scan_operations.="Utilisateur.Date_Connexion,Utilisateur.Heure_Connexion,";
  6. $scan_operations.="Produit_Operation.Id_Operation,Produit_Operation.Id_Produit,";
  7. $scan_operations.="Produit.Id_Produit,Produit_Lieu.Id_Lieu,Produit_Lieu.Id_Produit,";
  8. $scan_operations.="Lieu_Produit.Id_Lieu,Lieu_Produit.Nom_Lieu";
  9. $scan_operations.=" FROM Type_Operation";
  10. $scan_operations.=" INNER JOIN Operation";
  11. $scan_operations.=" ON Type_Operation.Id_Type_Operation=Operation.Id_Type_Operation";
  12. $scan_operations.=" INNER JOIN Operation_Util";
  13. $scan_operations.=" ON Operation.Id_Operation=Operation_Util.Id_Operation";
  14. $scan_operations.=" INNER JOIN Utilisateur";
  15. $scan_operations.=" ON Operation_Util.Id_Utilisateur=Utilisateur.Id_Utilisateur";
  16. $scan_operations.=" INNER JOIN Produit_Operation";
  17. $scan_operations.=" ON Produit_Operation.Id_Operation=Operation.Id_Operation";
  18. $scan_operations.=" INNER JOIN Produit";
  19. $scan_operations.=" ON Produit.Id_Produit=Produit_Operation.Id_Produit";
  20. $scan_operations.=" INNER JOIN Produit_Lieu";
  21. $scan_operations.=" ON Produit.Id_Produit=Produit_Lieu.Id_Produit";
  22. $scan_operations.=" INNER JOIN Lieu_Produit";
  23. $scan_operations.=" ON Produit_Lieu.Id_Lieu=Lieu_Produit.Id_Lieu";
  24. $scan_operations.=" WHERE Produit.Id_Produit='$idpdt'";
  25. $scan_operations.=" ORDER BY Operation.Id_Operation";


 
 
 

Reply

Marsh Posté le 24-04-2006 à 14:24:18   

Reply

Marsh Posté le 24-04-2006 à 14:49:41    

En fait j'y suis presque, parce que quand j'enlève le DISTINCT et que je fais un GROUP BY:
 
GROUP BY(Operation.Id_Operation)
 
Ben ça m'affiche comme il faut chacune des opérations sur le produit avec les infos de chaque opération...sauf que le lieu est toujours le même (alors que je mets des lieux différents pour chaque opération).
 
Y a pas un pro du GROUP BY qui pourrait me dire où est la dernière petite couille?
 
Merci

Reply

Marsh Posté le 26-04-2006 à 15:27:00    

Le problème vient de tes jointures. Pas le temps de chercher précisement le problème mais cherche dans tes jointures, y'a forcément un truc qui cloche. Tu dois normalement y arriver sans GROUP BY.
 
De plus regarde si la structure de ta base correspond à tes besoins.
 
Tu dis "A une opérations plusieurs utilisateurs et plusieurs lieux.". Ca me semble en contradiction avec l'exemple que tu donnes ;) !

Reply

Marsh Posté le 28-04-2006 à 11:43:13    

OK, donc ça peut quand même être faisable en 1 seule requête.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed