0

SQLの質問があります。次の一連のテーブルを使用しています。

http://imgur.com/eg19r.png

Recipe テーブルには 5 つのレシピが含まれ、Ingredient には多くの材料 (52) が含まれ、IngredientList は連想エンティティであり、Recipe と Ingredient の間の多対多の関係の実装です。RecipeID と IngredientID は、基本的に自動インクリメント ID 番号です。

すべてのベジタリアン レシピを表示するクエリを作成しようとしています (つまり、ベジタリアン レシピを含まないレシピ)

'%beef%',
'%pork%',
'%chicken%',
'%lamb%

関連付けられている Ingredient.Name のいずれかで)。私が直面している問題は、結果セットにレシピごとに 1 行ではなく、材料ごとに 1 行が含まれていることです。

この結果セットを生成するクエリは次のとおりです (ここでは Ingredient テーブルの名前が components であることに注意してください)。

SELECT recipe.name AS Dish, ingredients.name
 FROM (recipe JOIN ingredientlist ON recipe.recipeid=ingredientlist.recipeid
  JOIN ingredients ON ingredientlist.ingredientid=ingredients.ingredientid)
 WHERE ingredients.name NOT LIKE '%beef%'
  AND ingredients.name NOT LIKE '%chicken%' 
  AND ingredients.name NOT LIKE '%pork%' 
  AND ingredients.name NOT LIKE '%lamb%';

そのクエリは 50 の結果を生成します (私の WHERE 句によって除外された部分文字列を含む成分名に基づいて 2 つの成分が除外されるため、52 ではありません)。

私の目標は、レシピ テーブル内の 5 つのレシピ名のうち 3 つを返すことです (関連する materials.name に肉が含まれているものを差し引きます)。

4

2 に答える 2

1

材料テーブルにis_vegetarianフラグを追加することをお勧めします。

ただし、主な問題は、select句にcomponents.nameを含めることにより、データベースに50行を返すように要求していることです。レシピのみが必要な場合は、レシピのみを要求する必要があります。

select r.name as dish
from recipe r
where not exists (
  select 1 from ingredients i
  join ingredientlist il on i.ingredientsid=il.ingredientid
  where il.recipeid=r.recipeid
  and i.is_vegetarian = false
)
于 2010-01-22T14:53:51.157 に答える
0

私はこのクエリで終わりました:

SELECT r.name AS Dish
    FROM recipe r
    WHERE recipeid NOT IN (
        SELECT il.recipeID
            FROM ingredientlist il, ingredients i
            WHERE (il.ingredientid = i.ingredientid)
            AND (i.name LIKE '%beef%' OR i.name LIKE '%chicken%' OR i.name LIKE '%pork%' OR i.name LIKE '%lamb%'));
于 2010-01-25T13:37:36.393 に答える