2010-03-13 9 views
1

J'ai deux tables, videos et videos_ratings. La table des vidéos a un champ videoid int (et beaucoup d'autres mais ces champs ne sont pas importants je pense) et beaucoup d'enregistrements. La table videos_ratings a 3 champs int: videoid, rating, rated_by qui a plusieurs enregistrements (enregistrements multiples pour chaque champs de la table videos) mais pas pour tous les enregistrements de la table videos.Système d'évaluation MySQL (calcul de la moyenne à partir de deux tables)

Actuellement, j'ai la requête mysql suivante:

SELECT `videos`.*, avg(`videos_ratings`.`vote`) 
    FROM `videos`, `videos_ratings` 
    WHERE `videos_ratings`.`videoid` = `videos`.`videoid` 
GROUP BY `videos_ratings`.`videoid` 
ORDER BY RAND() LIMIT 0, 12 

Il sélectionne tous les enregistrements de la table videos qui ont une cote dans video_ratings de table et calcule la moyenne correctement. Mais ce dont j'ai besoin, c'est de sélectionner tous les enregistrements de la table videos, peu importe s'il y a une note pour cet enregistrement ou non. Et s'il n'y a pas de dossiers dans le tableau videos_ratings pour cet enregistrement videos particulier, la fonction moyenne devrait afficher 0.

quelqu'un Hope pouvait comprendre ce que je veux ... :)

Merci!

Répondre

0

Vous devez effectuer une LEFT JOIN pour inclure tous les enregistrements de la table des vidéos, même s'il n'y a pas d'évaluation.

Vous pouvez alors mettre un if() dans votre sélection pour transformer une cote NULL à 0.

1

Utilisation:

SELECT v.*, 
      COALESCE(x.avg_vote, 0) 
    FROM VIDEOS v 
LEFT JOIN (SELECT vr.videoid, 
        AVG(vr.vote) AS avg_vote 
      FROM VIDEO_RATINGS vr 
     GROUP BY vr.videoid) x ON x.videoid = v.videoid 
ORDER BY RAND() 
    LIMIT 12 

Soyez conscient que ORDER BY RAND() est redimensionnée pas bien - voir this question for better alternatives.