Pbme de jointure (débutant)

Pbme de jointure (débutant) - SQL/NoSQL - Programmation

Marsh Posté le 02-03-2011 à 09:41:05    

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.

Reply

Marsh Posté le 02-03-2011 à 09:41:05   

Reply

Marsh Posté le 02-03-2011 à 09:53:42    

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.

Reply

Marsh Posté le 02-03-2011 à 10:04:56    

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" ?

Reply

Marsh Posté le 02-03-2011 à 10:49:48    

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

Reply

Marsh Posté le 02-03-2011 à 10:59:05    

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  

Reply

Marsh Posté le 03-03-2011 à 13:18:30    

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

Reply

Sujets relatifs:

Leave a Replay

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