2012-07-08 114 views
0

我發現很難找到合適的標題。爲了簡單起見,讓我們說我有下面的表格:比較行並獲得百分比

cook_id cook_rating 
1  2 
1  1 
1  3 
1  4 
1  2 
1  2 
1  1 
1  3 
1  5 
1  4 
2  5 
2  2 

現在我想得到'好'廚師的輸出。一個好廚師的評級至少爲1,2或3,但不是4或5的至少70%。

所以在我的示例表中,ID爲1的廚師總共有10個評級,7其中1型,2型和3型。只有3種具有4型或5型。因此,具有ID 1的廚師將是「好」廚師,並且輸出應該是具有良好評級數量的廚師ID。

cook_id cook_rating 
1  7 

然而,id 2的廚師不滿足我的條件,因此不應該列出。

select cook_id, count(cook_rating) - sum(case when cook_rating = 4 OR cook_rating = 5 then 1 else 0 end) as numberOfGoodRatings from cook 
where cook_rating in (1,2,3,4,5) 
group by cook_id 
order by numberOfGoodRatings desc 

不過,這並沒有考慮到一個事實,即有可能是更多的4或5比不錯的收視率,導致負輸出。此外,至少70%的要求不包括在內。

+0

我相信你會對[本文]的解決方案感興趣(http://evanmiller.org/how-not-to-sort-by-average-rating.html)。 – 2012-07-08 16:27:16

+0

不錯的文章,但對我的需求太複雜。在我的情況下,我只想對有用的評分進行排序,如果這個人的評分超過70%。因此,擁有10個好評和0個差等級的人,與1000個好評等級的人相比,價值仍然「低得多」,但有300個爲負值,即使這不是對某人進行評級的好方法。 – 2012-07-08 16:37:01

回答

3

你可以在你的HAVING子句中進行比較。如果必須在結果集中剛纔的兩列,這可以被包裝成子選擇select cook_id, positive_ratings FROM (...)

SELECT 
    cook_id, 
    count(cook_rating < 4 OR cook_rating IS NULL) as positive_ratings, 
    count(*) as total_ratings 
FROM cook 
GROUP BY cook_id 
HAVING (positive_ratings/total_ratings) >= 0.70 
ORDER BY positive_ratings DESC 

編輯注意,COUNT(cook_rating < 4)旨在只算行,其中評級小於4. MySQL文檔說明count只會計算非空行。我沒有測試過,看看它是否與FALSE等於NULL,但我會驚訝它不。最壞的情況下,我們需要將其包裝在IF(cook_rating < 4, 1,NULL)中。

+0

我只是想問,如果cook_rating爲null會發生什麼。當我回家時,我會嘗試這個查詢。我可能會使用'coalesce',而不是'if'。 – 2012-07-08 17:05:47

+0

如果評級爲NULL,則根本不會涉及結果,因爲它不會與positive_ratings count()或total_ratings count()匹配。您可以通過添加'WHERE cook_rating IS NOT NULL'來確保這一點。 – 2012-07-08 17:12:54

+0

@TerryUhlang如果評級爲空,您希望做什麼? – Aprillion 2012-07-08 17:13:39

0

我建議你改變一下你的模式,使這種查詢微不足道。

假設你添加5列到你的廚師表,簡單地統計每個等級的數:更新這樣的表時,在數據庫中輸入一個新的評價

nb_ratings_1 nb_ratings_2 nb_ratings_3 nb_ratings_4 nb_ratings_5 

是平凡的,就如同將重新計算這些數字如果有冗餘讓你感到緊張。它使所有的過濾和分類變得快速和簡單。

+0

這不是標準化的模式!我會假設問題中的表格是「評分事件」,每個對應於廚師的用戶評分,在這種情況下,將每個事件排成一行非常有價值。此外,當您修改系統以支持1到10之間的評分時會發生什麼?改變你的模式? – 2012-07-08 16:49:47

+0

當然,這並不會阻止每個評分單獨保存(這就是爲什麼我提到冗餘)。是的,這意味着如果你改變了問題,你可以添加列。數據庫必須實用且快速,才能提供您所需的有用結果。這種傳播結構的目標是允許快速計算大多數種類的評級/排序。 – 2012-07-08 16:54:54