2010-03-13 7 views
1

두 개의 테이블 videosvideos_ratings이 있습니다. 비디오 테이블에는 int videoid 필드가 있습니다 (그리고 그 외 많은 필드는 중요하지 않습니다). 많은 레코드가 있습니다. videos_ratings 테이블에는 , rating, rated_by이라는 세 개의 int 필드가 있는데 videos 테이블의 각 필드에 대해 여러 레코드가 있지만 videos 테이블의 모든 레코드는 아닙니다.MySQL 등급 시스템 (두 테이블의 평균 계산)

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 

그것은 테이블 video_ratings의 등급이 올바르게 평균을 계산 테이블 videos의 모든 레코드를 선택 :

현재 나는 다음과 같은 MySQL의 쿼리가 있습니다. 하지만 그 레코드에 대한 평가가 있는지 여부와 상관없이 videos 테이블의 모든 레코드를 선택하면됩니다. videos_ratings 테이블의 모든 레코드가 특정 videos 레코드가없는 경우에, 평균 기능 : ... 0

희망 누군가가 내가 원하는 것을 이해할 수

감사를 표시해야합니다!

답변

0

평가가없는 경우에도 동영상 테이블의 모든 레코드를 포함하려면 LEFT JOIN을 수행해야합니다.

그런 다음 0

1

사용에 NULL 등급을 설정하는 당신의 선택에있는 경우()를 넣을 수 있습니다 :

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 

ORDER BY RAND()는 확장 성이 좋지 않음을주의하십시오 - this question for better alternatives를 참조하십시오.