2010-05-03 5 views
1

Je viens de créer un site web et je me suis rendu compte que je devais avoir un top 3 albums les mieux notés .. Je n'ai pas construit quelque chose qui garde une trace des notes. Les évaluations sont stockées séparément. Quelqu'un peut-il me montrer comment les assembler s'il vous plaît.Aide avec MySQL Join Statement

SELECT id, nom des albums LIMITER 3

note SÉLECTIONNEZ notes OÙ url = CONCAT ('album/show /', album.id)

Permettez-moi de chair juste un peu. Je dois récupérer ce qui suit:

De la table des albums. id, nom. À partir du tableau de classement, je dois récupérer la note moyenne. ROND ((note + note + note)/total des notes)

Les notes. Les utilisateurs peuvent noter tout sur mon site Web, j'ai donc un tableau de notes génériques. La note est stockée avec l'URL de la page à laquelle elle s'applique. Par conséquent, pour obtenir des évaluations d'album, je dois avoir 'albums/show/{album_id}'. En arrière de vue j'aurais dû avoir un champ de type et d'id mais c'est un peu en retard maintenant avec un déjeuner iminient.

Toute aide est très appréciée.

+1

-vous chose que vous pouvez ajouter l'album Id à la table des évaluations? Cela rendrait votre jointure ** MUCH ** plus efficace. Que 'CONCAT ('albums/show /', a.id)' dans la jointure va tuer la performance – lexu

Répondre

2
SELECT 
    a.id, 
    a.name, 
    AVG(r.rating) AS average 
FROM 
    albums a 
    LEFT JOIN 
    ratings r 
    ON 
    r.url = CONCAT('albums/show/', a.id) 
GROUP BY 
    a.id 
ORDER BY 
    average DESC 
LIMIT 3 

(Non vérifié, voir AVG())

+0

Génie, merci beaucoup très beaucoup +1 – JasonS

+0

@JasonS Vous êtes les bienvenus. Envisagez de refactoriser un ID et un "nom de référence" (par exemple "albums") dans la table "ratings" afin d'optimiser la requête. En outre, pensez à ajouter ', a.id DESC' à la clause' ORDER' pour forcer la commande secondaire s'il n'y a pas (encore) 3 albums classés. – jensgram