MySQL: как я могу объединить несколько условных значений AVG с Group By

У меня есть сайт, который позволяет пользователям оценивать видео по разным тегам, например, как забавно или насколько интересно они считают видео, позволяя пользователям оценивать одно и то же видео несколькими способами.

В настоящее время сайт позволяет сортировать видео по определенным тегам, который учитывает среднюю оценку пользователя тега для этого видео. Сейчас я пытаюсь сделать запрос MySQL, который может сортировать видео на основе среднего совокупного рейтинга нескольких тегов. Например, показаны все смешные и интересные видео.

Я не могу понять, как это сделать с помощью одного запроса.

Это то, что нужно использовать для сортировки по одному тегу

SELECT *, AVG(ratings.rating) as avgTagFunny 
FROM videos, ratings 
WHERE videos.id = ratings.video_id 
AND ratings.tag_id = 2 
GROUP BY video_id
ORDER BY avgTagFunny DESC

Самое близкое, что я получил, делало что-то вроде этого

SELECT *, AVG(ratings.rating) as avgTag, count(distinct tag_id) as distinctTags
FROM videos, ratings 
WHERE videos.id = ratings.video_id 
AND ratings.tag_id IN (2, 12) 
GROUP BY video_id 
HAVING distinctTags > 1
ORDER BY avgTag DESC

Проблема в том, что он принимает среднее значение всех оценок, поэтому, если 3 пользователя оценили, насколько смешным является видео, и только один из них оценил его интересность, общее среднее значение будет искажено. Я хочу отсортировать по среднему рейтингу одного тега плюс среднее значение другого тега, деленное на 2.


Вот некоторые примеры данных, как и было запрошено.

Таблицы:

videos: id, title
tags: id, name
users: id, name
ratings: id, user_id, video_id, tag_id, rating

Пример данных для всех рейтингов видео с идентификатором 342:

1, 7, 342, 2, 90
2, 10, 342, 2, 80
3, 10, 342, 12, 70
4, 11, 342, 2, 85
5, 7, 342, 12, 50

Как видите, средний рейтинг тега 2 будет равен 85, а средний рейтинг тега 12 - 60. Среднее из этих двух значений составляет 72,5. Мы не хотим получить среднее значение по всем рейтингам, потому что это будет 75, и оно будет перекошено в сторону одного тега, поскольку тега 2 больше, чем тега 12.

По первому запросу я разместил заказы по средним рейтингам одного тега. Второй запрос, который я разместил, упорядочивает их по всем рейтингам обоих тегов, но он не идеален, потому что он искажен.

Я ищу способ упорядочить результаты по (средние оценки тега 2 + средние оценки тега 12) / 2. Надеюсь, это имеет смысл!

1 ответ

Решение
SELECT  video_id, AVG(rating) rating
FROM    (
        SELECT  video_id, AVG(rating) rating
        FROM    ratings
        WHERE   tag_id IN (2, 12)
        GROUP BY
                video_id, tag_id
        ) q
GROUP BY
        video_id
ORDER BY
        rating DESC
Другие вопросы по тегам