Как написать subquery так, чтобы можно было использовать where в данном случае
Select
SELECT
b.bookID
, b.title
, b.author
, b.image
, (Case When SUM(r.rateIndex)/cout.cout then SUM(r.rateIndex)/cout.cout ELSE 0 END) as total
FROM books AS b
LEFT JOIN ratingsystem AS r
ON b.bookID = r.FK_bookID
LEFT JOIN (SELECT FK_bookID AS 'book_ID', COUNT(rateIndex) AS 'cout' FROM ratingsystem GROUP BY FK_bookID) AS cout
ON r.FK_bookID = cout.book_ID
GROUP BY cout.book_ID, b.bookID, cout.cout
Что хочу добавить:
WHERE total >= '4'
Ответы (1 шт):
Автор решения: Arkee
→ Ссылка
Не совсем понятны группировки, да и структура таблиц неизвестна (SQL вроде Oracle). Но предположу, что вам надо получить средний рейтинг по книгам. Т.е. поле bookId в таблице книг уникально. Тогда не надо делать выборку с группировкой из таблицы ratingsystem два раза. Достаточно сразу посчитать количество, сумму и группировать. Потом разделить при соединении с таблицей books, предварительно проверив деление на ноль. А total можно в конце присобачить:
SELECT
t.bookID,
t.title,
t.author,
t.image,
t.total
FROM
(
SELECT
b.bookID,
b.title,
b.author,
b.image,
CASE WHEN r.rateSum > 0 AND r.rateCount > 0 THEN r.rateSum/r.rateCount ELSE 0 END AS total
FROM
books AS b
LEFT JOIN (
SELECT
FK_bookID,
SUM(rateIndex) AS 'rateSum',
COUNT(rateIndex) AS 'rateCount'
FROM ratingsystem r
GROUP BY
FK_bookID
) r ON r.FK_bookID = b.bookID
) t
WHERE
t.total > 4