2012-07-08 144 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