Нужна помощь с SQL запросом. Не могу определить автора с самой высокой средней оценкой книг
Всем привет! Мне нужна помощь с SQL. У меня есть несколько таблиц, между ними связи.

Мне нужно определить автора с самой высокой средней оценкой книг — учитываем только книги с 50 и более оценками. Пишу вот такой запрос:
SELECT a.author_id,
ROUND(AVG(ra.rating), 2) AS avg_rating,
COUNT(ra.rating_id)
FROM
books AS b,
authors AS a,
ratings AS ra
WHERE
b.book_id = ra.book_id AND b.author_id = a.author_id
GROUP BY
a.author_id
HAVING COUNT(ra.rating_id) >= 50
ORDER BY count DESC
Получается, что я считаю HAVING COUNT(ra.rating_id) >= 50 по авторам, а мне нужно по книгам. Подскажите как поправить запрос? Чтобы я получил автора с самой высокой средней оценкой книг (учитываем только книги с 50 и более оценками) Спасибо.
Ответы (1 шт):
В таких случаях пробуйте рассмотреть задачу по частям. Вот для начала средние оценки книг с 50 и более оценками (у меня тут MySQL).
select
`book_id`,
avg(`rating`) as `book_rating_avg`
from `ratings`
group by `book_id`
having count(*) >= 50
Результат этого запроса можно рассматривать как таблицу. Если с такой таблицей сджойнить запрос в books, то можно будет группировать по авторам.
select
`books`.`author_id`,
avg(`book_avg_ratings`.`book_rating_avg`) as `author_rating_avg`
from `books`
inner join (
select
`book_id`,
avg(`rating`) as `book_rating_avg`
from `ratings`
group by `book_id`
having count(*) >= 50
) as `book_avg_ratings` on
`book_avg_ratings`.`book_id` = `books`.`id`
group by `books`.`author_id`
order by `author_rating_avg` desc
Конечно, всё это добро работает довольно медленно. Если данных много, а запрос надо выполнять часто, то имеет смысл рассчитывать количество оценок и среднюю оценку книги при добавлении оценки, например.