我有一个网站,可让用户根据不同的标签对视频进行评分,例如他们认为视频有多么有趣或多么有趣,允许用户以多种方式对同一视频进行评分。
该网站目前允许按特定标记对视频进行排序,并考虑该视频标记的平均用户评分。我现在正在尝试创建一个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
视频ID 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.我希望这是有道理的!
答案 0 :(得分: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