2

レシピ データベースを想像してみてください。次の 3 つのテーブルがあります。

tbl_recipes、tbl_recipe_ingredients、および tbl_ingredients。

食材は野菜でも肉でもかまいません。(ingtype フィールド)

2 つのクエリが必要です。1 つは野菜と肉を含むすべてのレシピを取得するためのもので、もう 1 つは野菜のみを取得するためのものです。

このクエリを試してみましたが、正確な数の結果が返されません。

SELECT DISTINCT tbl_recipes.title
FROM tbl_recipe_ingredients
INNER JOIN tbl_recipes ON tbl_recipe_ingredients.recipe_id = tbl_recipes.id
INNER JOIN tbl_ingredients ON tbl_recipe_ingredients.ingredient_id = tbl_ingredients.id
WHERE tbl_ingredients.ingtype = 'vegetable'
GROUP BY tbl_recipes.id
HAVING COUNT( DISTINCT tbl_ingredients.ingtype ) = 1

機能していないもう 1 つのことは、Count を = 2 (各成分タイプの 1 つ以上を意味する) に変更すると、結果が得られないことです。

これはトップ N タイプのクエリのバリエーションだと思いますが、このクエリのどこに問題があるのか​​わかりません。

助けていただければ幸いです。

4

2 に答える 2

1

COUNT野菜のみを含むタイトルを取得するには、 withを使用して次のようにすることができますCASE

SELECT DISTINCT tbl_recipes.title
FROM tbl_recipe_ingredients
   INNER JOIN tbl_recipes ON tbl_recipe_ingredients.recipe_id = tbl_recipes.id
   INNER JOIN tbl_ingredients ON tbl_recipe_ingredients.ingredient_id = tbl_ingredients.id
GROUP BY tbl_recipes.id
HAVING COUNT( CASE WHEN tbl_ingredients.ingtype = 'vegetable' THEN 1 END ) = COUNT(1)

これは、野菜に等しいすべての成分タイプをカウントし、全体のカウントと比較します。それらが同じ場合、一致しています。


次に、野菜と肉の両方を含むものを取得するには、次のようにします。

SELECT DISTINCT tbl_recipes.title
FROM tbl_recipe_ingredients
   INNER JOIN tbl_recipes ON tbl_recipe_ingredients.recipe_id = tbl_recipes.id
   INNER JOIN tbl_ingredients ON tbl_recipe_ingredients.ingredient_id = tbl_ingredients.id
WHERE tbl_ingredients.ingtype IN ('vegetable','meat')
GROUP BY tbl_recipes.id
HAVING COUNT( DISTINCT tbl_ingredients.ingtype ) = 2

2 番目のクエリのWHERE句は必要ない場合があります。他の原料タイプがあるかどうかによって異なります。DISTINCTこれは、材料の種類を数えて 2 になるようにします。

于 2013-05-30T18:29:54.003 に答える