MySQL Rating System (подсчет среднего по двум таблицам) - PullRequest
1 голос
/ 13 марта 2010

У меня есть две таблицы, videos и videos_ratings. Таблица videos имеет поле int videoid (и многие другие, но я думаю, что эти поля не важны) и множество записей. Таблица videos_ratings имеет 3 поля типа int: videoid, rating, rated_by, в которых имеется много записей (несколько записей для каждого поля из таблицы 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

Он выбирает все записи из таблицы videos, которые имеют рейтинг в таблице video_ratings, и правильно вычисляет среднее значение. Но мне нужно выбрать все записи из таблицы videos, независимо от того, есть оценка для этой записи или нет. И если в таблице videos_ratings для этой конкретной записи videos нет записей, функция усреднения должна показывать 0.

Надеюсь, кто-то мог понять, чего я хочу ...:)

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 марта 2010

Использование:

   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() плохо масштабируется - см. этот вопрос для лучших альтернатив .

0 голосов
/ 13 марта 2010

Вам необходимо выполнить LEFT JOIN, чтобы включить все записи из таблицы видео, даже если рейтинг отсутствует.

Затем можно выбрать if () для выбора, чтобы значение NULL было равно 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...