MySQL:如何将多个条件AVG值与分组

时间:2015-07-14 23:19:32

标签: mysql tags rating-system

我有一个网站,可让用户根据不同的标签对视频进行评分,例如他们认为视频有多么有趣或多么有趣,允许用户以多种方式对同一视频进行评分。

该网站目前允许按特定标记对视频进行排序,并考虑该视频标记的平均用户评分。我现在正在尝试创建一个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.我希望这是有道理的!

1 个答案:

答案 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