2014-11-01 96 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; 

如果不收集的個人評論的標準偏差,那麼這種方法是行不通的。