Как написать subquery так, чтобы можно было использовать where в данном случае

Рейтинг: 0Ответов: 1Опубликовано: 22.01.2023

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'

Ответы

▲ 0Принят

Не совсем понятны группировки, да и структура таблиц неизвестна (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