SQL复杂排序由两列组成

时间:2014-11-01 15:41:32

标签: mysql sql sorting

我想用SQL来获得5"最好的"额定档案。问题是,我不希望排名完全基于成绩。

假设有一个等级为8.1的个人资料,但有5个评论我想要这样,以便评分为7.9和30的评论将排名更高。

如果等级最高为.3,而且最低30%的评论高于另一个,我怎样才能实现这一目标?

这是我现在的查询:(平均=评分,评论=评论数量)

 SELECT name,reviews,average 
 FROM profiles 
 WHERE average >= 7 
    AND reviews >= 50 
 ORDER BY average  DESC, reviews DESC 
 LIMIT 5

3 个答案:

答案 0 :(得分:1)

您可以在ORDER BY子句中执行类似的计算。我会一直试着看看我是否可以完全你想要的是什么,但是首先,你可以对这样的排序进行加权。

SELECT name,reviews,average 
FROM profiles 
WHERE average >= 7 
   AND reviews >= 50 
ORDER BY (average*.7 + reviews*.3) 
LIMIT 5

答案 1 :(得分:1)

嗯,我不确定你是如何实施你的具体规则的。

通常在面对此任务时,我经常从评估的估计值中减去一个标准误差。这给出了评级的下限,具有一定程度的置信度。一般来说,评论越多,信心越强,标准差越低。

如果你知道个人评论,可以很容易地计算出来:

SELECT name, count(*) as numreviews, avg(reviews),
       avg(review) - std(review)/sqrt(count(*)) as avg_lb
FROM reviews r
ORDER BY avg_lb DESC
LIMIT 5;

如果您没有收集个人评论的标准差,则此方法将无效。

答案 2 :(得分:0)

您可以动态计算个人资料的实际评分并按此排序。

类似的东西:

SELECT name,reviews,average, (reviews * average) AS rating 
 FROM profiles 
 WHERE average >= 7 
    AND reviews >= 50 
 ORDER BY rating DESC
 LIMIT 5

在上面的示例中,您可以使用您想要的任何算法替换(reviews * average)来计算评级。

请记住,如果您有一个复杂的算法,查询可能会变慢,您可能希望有一个专门的列,并在每次算法中涉及的任何变量发生更改时重新计算评级。