Посчитайте комментарии и получите средний рейтинг от mysql - PullRequest
0 голосов
/ 31 октября 2018

Я просто не могу понять, как получить средний рейтинг и посчитать комментарии из моей базы данных mysql.

У меня есть 3 таблицы (активность, рейтинг, комментарии). Активность содержит основные данные о «действиях», рейтинг содержит рейтинги и комментарии - конечно же, рейтинги.

activity_table

id | title |short_desc | long_desc | address | lat | long |last_updated

rating_table

id | activityid | userid | rating

comment_table

id | activityid | userid | rating

Сейчас я пытаюсь получить данные об активности, а также комментарии_счета и среднее_рейтинг в одном запросе.

SELECT activity.*, AVG(rating.rating) as average_rating, count(comments.activityid) as total_comments
FROM activity LEFT JOIN
     rating
     ON activity.aid = rating.activityid LEFT JOIN
     comments
     ON activity.aid = comments.activityid
GROUP BY activity.aid 

... не выполняет работу. Это дает мне правильное среднее значение, но неправильное количество комментариев.

Есть идеи? Большое спасибо!

1 Ответ

0 голосов
/ 31 октября 2018

Вы агрегируете по двум разным измерениям. Декартово произведение, созданное объединениями, влияет на агрегацию.

Итак, вы должны агрегировать до join s:

SELECT a.*, r.average_rating, COALESCE(c.total_comments, 0) as total_comments
FROM activity a LEFT JOIN
     (SELECT r.activityid, AVG(r.rating) as average_rating
      FROM rating r
      GROUP BY r.activityid
     ) r
     ON a.aid = r.activityid LEFT JOIN
     (SELECT c.activityid, COUNT(*) as total_comments
      FROM comments c
      GROUP BY c.activityid
     ) c
     ON a.aid = c.activityid;

Обратите внимание, что внешний GROUP BY больше не нужен.

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