2014-11-01 78 views
2

我想使用SQL来获得5个“最佳”评级配置文件。问题是,我不希望只根据成绩排名。按两列排序的SQL复杂

说有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 
+0

我认为你可以创建一个计算列的视图,如:'Adjusted_Grade = Number_of_Reviews/10.0 + Raw_Grade' – 2014-11-01 15:53:04

+0

你可以写一个排序函数,它只需要一行并生成一个好的值,可以正确排列所有东西吗?我怀疑没有;它很可能需要两行,而不是一行。这将使它很难。顺便提一下,您的两个示例配置文件都会被查询中的过滤条件拒绝。 – 2014-11-01 18:29:36

回答

1

您可以在ORDER BY条款中做了类似的计算。我会继续努力,看看我是否可以得到正好你要做什么,但开始时,你可以减轻你的排序这样的事情。

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

这大概是行不通的,因为“评论”的范围比平均范围大得多,因此它将主导计算。 – 2014-11-01 16:09:07

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)

请记住,如果你有一个复杂的算法的查询可以变得缓慢,你可能希望有一个专门的柱,每一次重新计算的评价中涉及的任何算法变化的变量。

+1

在mysql中,你不能通过别名进行排序。所以'(评论*平均值)'必须在'ORDER BY'中表达。 – cyk 2014-11-01 15:54:00

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; 

如果不收集的个人评论的标准偏差,那么这种方法是行不通的。