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の少なくとも70%の評価を持っているが、4または5の評価を持っていない人のことです。

したがって、私の例の表では、ID 1の料理人は合計10の評価を持ち、そのうち7つはタイプ1、2、3です。3つだけがタイプ4または5です。したがって、ID1の料理人は「良い」料理人になります。 、および出力は、適切な評価の数を含む料理人の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%の要件は含まれていません。

4

2 に答える 2

3

これは、HAVING句の比較で取得できます。結果セットに2つの列だけが必要な場合は、これを副選択としてラップできます。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はnull以外の行のみをカウントすると記載されています。FALSEとNULLが等しいかどうかを確認するためにこれをテストしていませんが、そうでないことに驚かれることでしょう。最悪のシナリオでは、それをでラップする必要がありIF(cook_rating < 4, 1,NULL)ます。

于 2012-07-08T16:47:32.773 に答える
0

この種のクエリを簡単にするために、スキーマを少し変更することをお勧めします。

クックテーブルに5つの列を追加して、各評価の数を単純に数えるとします。

nb_ratings_1 nb_ratings_2 nb_ratings_3 nb_ratings_4 nb_ratings_5 

DBに新しい評価が入力されたときにこのようなテーブルを更新するのは簡単です。冗長性があると緊張する場合は、これらの数値を再計算するのと同じです。また、すべてのフィルタリングと並べ替えが迅速かつ簡単になります。

于 2012-07-08T16:45:03.247 に答える