Mysql 我应该如何构造查询以按最佳评级对列表进行排序?
我有一个列表和一个评论表。我想排序的最佳评级列表,但我的想法有一个问题。。。如果我按平均评级排序,平均5颗星但只有一个评论的列表在列表中的排名将高于平均4.5颗星的500个评论的列表。如果我有以下问题,我如何解决这个问题Mysql 我应该如何构造查询以按最佳评级对列表进行排序?,mysql,Mysql,我有一个列表和一个评论表。我想排序的最佳评级列表,但我的想法有一个问题。。。如果我按平均评级排序,平均5颗星但只有一个评论的列表在列表中的排名将高于平均4.5颗星的500个评论的列表。如果我有以下问题,我如何解决这个问题 SELECT l.listing_id, l.listing_title, COUNT(rev.review_id) AS total_reviews, (FLOOR(((SUM(rev.score) / COUNT(rev.review_id))) * 2) / 2)
SELECT
l.listing_id, l.listing_title,
COUNT(rev.review_id) AS total_reviews, (FLOOR(((SUM(rev.score) / COUNT(rev.review_id))) * 2) / 2) AS stars
FROM listings AS l
LEFT JOIN reviews AS rev ON l.listing_id = r.review_listing_id
GROUP BY l.listing_id
ORDER BY {what to order by}
你需要一些公式 示例来自: 加权评级(WR)=(v÷(v+m))×R+(m÷(v+m))×C 其中: R=电影的平均值(平均值)=(评级)
v=电影的票数=(票数)
m=需要列入前250名(目前为25000名)的最低票数
C=整个报告的平均投票数 因此,您可以通过以下方式:
SELECT
l.listing_id, l.listing_title,
COUNT(r.review_id) AS total_reviews,
(FLOOR((AVG(rev.score) * 2) / 2) AS stars,
(
SELECT
AVG(FLOOR(AVG(rev.score) * 2) / 2)
FROM
reviews AS r
INNER JOIN
listings AS l ON r.review_listing_id = l.listing_id
) as totalAvg,
((total_reviews / (total_reviews+5)) * stars + (5 / (total_reviews+5)) * totalAvg) AS wr
FROM
listings AS l
LEFT JOIN
reviews AS rev ON l.listing_id = r.review_listing_id
GROUP BY
l.listing_id
ORDER BY
wr
编辑:查询不正确我认为这个问题在MySQL中没有解决。你会发现很多评级系统在提交x个评论之前不会发布平均评级。例如,如果经常在网上看到“这个列表需要5次以上的评论才能进行评级”。我看到了这个公式,但我不太明白他们对M变量的定义是什么意思。。。如果你不在乎最低票数怎么办?这还会包括所有列表吗?@ShoeLace1291如果您没有最小值,只需使用
1
@ShoeLace1291,或者您可以根据您认为重要的内容使用自己的公式。知道我为什么会出现“字段列表中的未知列总数”错误吗?