我发现很难找到合适的标题。为简单起见,我假设我有下表:
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%的要求。
答案 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中输入新的评级时更新这样的表是微不足道的,就像重新计算这些数字一样,如果有冗余会让你感到紧张。它使所有过滤和排序变得快速而简单。