Структура таблицы
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 решает проблему, но вместо этого необходимо отображать несколько строк.
Неважно … смог понять это. Подзапрос используется как объединенная таблица вместо столбца.
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
Других решений пока нет …