2016-04-18 14 views
0

2つのテーブルがあります。 1は「レシピ」と呼ばれ、1つは「成分」と呼ばれます。レシピテーブルには、id、recipe_name、calories、bld(朝食、昼食、夕食のB、L、Dの列挙リスト)、prep(準備時間)、skill(別の列挙リスト) int、およびadv)。SQLクエリーから予期しない結果を得る

私は以下を持っています:recipe_id(recipes_id(recipesテーブルのidカラムに対する外部キー制約付き)、およびingredient_name、および他のいくつかのカラム。

私はレシピテーブルのカラムと原料テーブルのingredients_name欄をいくつかの条件で選択しようとしています - 原料テーブルに成分が含まれていなくても、すべてのレシピを返信したい実際にはこれは私がとにかく学ぶためのものです)、その成分の1つにユーザーが入力するキーワードの一部が含まれている場合はレシピを除外したい(次の例ではキーワードとして「olive」を使用しています)。ここで

は、これまでのところ、私のSQLです:

SELECT recipes.*, ingredients.ingredient_name 
FROM recipes 
LEFT OUTER JOIN ingredients 
ON ingredients.recipe_id=recipes.id 
WHERE ingredients.ingredient_name <> '%olive%' 
ORDER BY RAND() LIMIT 7 

これが唯一の食材を使ったレシピを返し、「オリーブ」は、食材の名前の一つの一部であり、レシピなど、まだです。データのセットで考えるのは、このタイプのロジックで作業する場合それは、最善の任意のヘルプ

+0

:SET1セットとセットSET2を制限私たちがやりたいことは、前のステップで設定することによって、このセットを制限です。あなたがしているのは、 '%olive%'を含む成分からレコードをすべて削除することだけです。その成分線を持つレシピだけに限定するのではありません。さて、「レシピ*」は悪い習慣です。もう少しタイピングしなくてはなりませんが、あなたが望む完全な列リストはより良い規則です。 –

+0

ありがとうございます – HauntedSmores

答えて

1

ため

感謝。

セット1:オリーブの成分であるレシピの一覧:

SELECT recipe_id 
FROM ingredients 
WHERE ingredient_name LIKE '%olive%' 

は今、我々は、彼らがそれらにオリーブを持っているので、我々は除外することができますレシピのセットを持っています。

SET 2:レシピとその成分のリスト:

SELECT recipes.*, ingredients.ingredient_name 
FROM recipes 
LEFT OUTER JOIN ingredients 
ON ingredients.recipe_id=recipes.id 

ここには驚き。すべてのセット。

SET 3:あなたは正しくあなたの質問に答えていない

SELECT recipes.*, ingredients.ingredient_name 
FROM recipes 
LEFT OUTER JOIN ingredients 
ON ingredients.recipe_id=recipes.id 
WHERE recipes.id NOT IN 
    (
    SELECT recipe_id 
    FROM ingredients 
    WHERE ingredient_name LIKE '%olive%' 
    ) 
+0

良い答え。代わりに - _WHERE recipes.id NOT IN_は "SET 3"の_WHERE NOT EXISTS_に置き換えることができます – PaulF

+0

ありがとうございます!今すぐテストしよう – HauntedSmores