Как заказать книги по рейтингу пользователей - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь получить все книги по рейтингу пользователей desc:

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

Например:

Оценка Гарри Поттера 4,5

SELECT T1.*, T2.AVG(T2.Rate) AS Rate
    FROM Books AS T1 
    INNER JOIN BookRates as T2
    ON T1.BookId = T2.BookId
    GROUP BY T1.BookId
    ORDER BY Rate desc

Этот запрос не 't возвращает желаемый результат.

1 Ответ

0 голосов
/ 08 апреля 2019

Сначала вы получаете среднее значение Rate для каждого BookId с group by, а затем присоединитесь к Books, чтобы получить детали каждой книги:

SELECT b.*, g.Rate FROM Books AS b INNER JOIN ( 
    SELECT T1.BookId, AVG(T2.Rate) AS Rate
    FROM Books AS T1 
    INNER JOIN BookRates as T2
    ON T1.BookId = T2.BookId
    GROUP BY T1.BookId
) AS g on g.BookId = b.BookId
ORDER BY g.Rate desc

Если есть книги, которые не оценены, то вы должны использовать левое соединение:

SELECT b.*, coalesce(g.Rate, 0) AS Rate FROM Books AS b LEFT JOIN ( 
    SELECT T1.BookId, AVG(T2.Rate) AS Rate
    FROM Books AS T1 
    INNER JOIN BookRates as T2
    ON T1.BookId = T2.BookId
    GROUP BY T1.BookId
) AS g on g.BookId = b.BookId
ORDER BY coalesce(g.Rate, 0) desc
...