比较行并获得百分比

时间:2012-07-08 16:25:38

标签: mysql sql

我发现很难找到合适的标题。为简单起见,我假设我有下表:

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

现在我想得到'好'厨师的输出。一个好厨师的评分为至少70%的1,2或3,但不是4或5。

所以在我的示例表中,id为1的厨师总共有10个等级,其中7个有1,2和3型。只有3个有4或5型。因此,ID为1的厨师将是''好的'做饭',输出应该是厨师的好评和好评。

cook_id cook_rating
1       7

然而,身份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%的要求。

2 个答案:

答案 0 :(得分: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&lt; 4)仅用于计算评级小于4的行.MySQL文档说count只计算非空行。我没有测试过它,看它是否等于FALSE和NULL,但我会惊讶它没有。最糟糕的情况是,我们需要将其包含在IF(cook_rating < 4, 1,NULL)

答案 1 :(得分:0)

我建议您更改一下您的架构,以使这种查询变得微不足道。

假设您在烹饪表中添加5列,只需计算每个评分的数量:

nb_ratings_1 nb_ratings_2 nb_ratings_3 nb_ratings_4 nb_ratings_5 

在DB中输入新的评级时更新这样的表是微不足道的,就像重新计算这些数字一样,如果有冗余会让你感到紧张。它使所有过滤和排序变得快速而简单。