Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
705 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pbme de jointure (débutant)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pbme de jointure (débutant)

n°2060575
Ekud
Posté le 02-03-2011 à 09:41:05  profilanswer
 

Bonjour à tous,
 
Je me tourne vers vous pour un problème que je rencontre actuellement sur une simple requête Sql. Je vous exposes mon problème :
 
Je possède 2 tables ("Produits" et "Notes" ). Les utilisateurs peuvent apprécier les produits en leur donnant une note. Ma requête a pour but de retourner chaque produits avec ne nombre de notes attribuées ainsi que la moyenne des notes (trié sur les moyennes décroissantes).
 
Schéma grossier de mes 2 tables :
 
Produit
----------
id_prod
nom_prod
 
Notes
----------
id_note
id_prod
note
 
Ma requête actuelle resseble à celà :
 
SELECT Produits.*, AVG(Notes.note) AS noteMoyenne, COUNT(Notes.id_note) AS noteTotal FROM Produits, Notes WHERE Produits.id_prod = Notes.id_prod ORDER BY noteMoyenne DESC, noteTotal DESC
 
 
Le problème de ma requête est qu'elle retourne uniquement les produits qui ont déjà été noté. Les autres ne s'affichent pas. Hors, je souhaiterais que les produits qui n'ont pas encore été noté puissent également s'afficher avec bien sûr "0" comme moyenne et total des notes.
 
 
Quelqu'un pourrait-il m'éclairer sur le sujet ?
 
Merci d'avance.

mood
Publicité
Posté le 02-03-2011 à 09:41:05  profilanswer
 

n°2060579
antac
..
Posté le 02-03-2011 à 09:53:42  profilanswer
 

Ne fais pas les jointures dans le where, c'est une hérésie, si tu veux faire des équi-jointures, utilise INNER JOIN
Dans ton cas, tu as besoin d'un LEFT JOIN, renseigne toi là dessus.

n°2060584
Ekud
Posté le 02-03-2011 à 10:04:56  profilanswer
 

Merci antac :)
 
J'ai modifié ma requête pour la suivante :
 
SELECT Produits.*, AVG(Notes.note) AS noteMoyenne, COUNT(Notes.id_note) AS noteTotal FROM Produits LEFT JOIN Notes ON Produits.id_prod = Notes.id_prod GROUP BY Produit.id_prod ORDER BY noteMoyenne DESC, noteTotal DESC  
 
Et celà semble fonctionner. Seul petit bémol, lorsqu'un produit ne possède aucune notation, le moyenne qui ressort est une valeur "NULL". Comment pourrais-je faire pour que la valeur de sortie soit "0" ?

n°2060592
Ekud
Posté le 02-03-2011 à 10:49:48  profilanswer
 

Je crois avoir trouvé la solution avec l'instruction "COALESCE".
 
Merci pour le coup de main.

n°2060596
antac
..
Posté le 02-03-2011 à 10:59:05  profilanswer
 

Si tu utilises MySQL,  
SELECT Produits.*, IFNULL(AVG(Notes.note),0) AS noteMoyenne, COUNT(Notes.id_note) AS noteTotal  
FROM Produits LEFT JOIN Notes ON Produits.id_prod = Notes.id_prod GROUP BY Produit.id_prod  
 
ORDER BY noteMoyenne DESC, noteTotal DESC  

n°2060911
Ekud
Posté le 03-03-2011 à 13:18:30  profilanswer
 

Ca m'a l'air en effet plus propre, merci beaucoup =)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pbme de jointure (débutant)

 

Sujets relatifs
Bouton supprimer / DébutantRESOLU [Access 2003] Requête jointure et union
Probleme de jointure sur une seule table sql[ACCESS] Problème jointure entre requêtes
[PHP] Jointure sur plusieurs champ ?Jointure et choix de valeurs par defaut (pour traduction)
[VBA Excel 2003 - débutant] Macro et renommage d'un classeur ExcellQuelques conseils pour un débutant en programmation
Req sur 3 fichiers Excel - Comment s'utilise RechercheV en VBA svp ?Débutant, problème master mind en C.
Plus de sujets relatifs à : Pbme de jointure (débutant)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR