MySQL отображает среднее значение для всех строк

Структура таблицы

rating.post_id
rating.user_id
rating.rate_like
rating.rate_dislike

Пример данных:

rating.post_id = 1
rating.user_id = 1
rating.rate_like = 1
rating.rate_dislike = 0

rating.post_id = 1
rating.user_id = 2
rating.rate_like = 1
rating.rate_dislike = 0

rating.post_id = 1
rating.user_id = 3
rating.rate_like = 0
rating.rate_dislike = 1

Учитывая структуру выше, пост 1 оценивается пользователями 1, 2 и 3, в которых пользователи 1 и 2 голосовали за подобное, а пользователь 3 голосовал за неприязнь.

С этим, как получить среднее значение, где рейтинг 5 (пять) звезд?

Формула:
(((total rate_like / total votes) * 100) * 0.5) / 10 = Rate (round to nearest .5)

Пример:
(((2/3) * 100) * 0.5) / 10 = 3.33 (round to 3.5)

Оценить будет 3,5 из 5 звезд

Ожидаемый вывод MySQL будет:

post_id = 1
rate_like = 2
rate_dislike = 1
total_rating = 3.5

Вот что я сделал с SQL, но я не знаю, как сделать это только в одном SQL-заявлении.

Это получает среднее значение:

select round(round((((sum(rate_like) / (sum(rate_like) + sum(rate_dislike)) * 100) * 0.5) / 10) * 2) / 2, 1) from rating group by post_id

В который следует вписать следующее утверждение:

SELECT post_id, sum(rate_like), sum(rate_dislike), (sum(rate_like) + sum(rate_dislike)) from rating group by post_id

Слияние двух операторов дает ошибку subquery returns more than 1 row:

SELECT post_id, sum(rate_like), sum(rate_dislike), (sum(rate_like) + sum(rate_dislike)), (select round(round((((sum(rate_like) / (sum(rate_like) + sum(rate_dislike)) * 100) * 0.5) / 10) * 2) / 2, 1) from rating group by post_id) from rating group by post_id

Добавление where пункт на обоих select Statement решает проблему, но вместо этого необходимо отображать несколько строк.

1

Решение

Неважно … смог понять это. Подзапрос используется как объединенная таблица вместо столбца.

SELECT
rating.post_id,
sum(rate_like),
sum(rate_dislike),
(sum(rate_like) + sum(rate_dislike)),
column_rating
from rating
inner join (
select
post_id,
round(round((((sum(rate_like) / (sum(rate_like) + sum(rate_dislike)) * 100) * 0.5) / 10) * 2) / 2, 1) as column_rating
from rating group by post_id
) as rating_table
on rating.post_id = rating_table.post_id
group by rating.post_id

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector