0

私は次の簡略化されたテーブルを持っています:

CREATE TABLE recipe(id int, name varchar(25));  
CREATE TABLE ingredient(name varchar(25));  
CREATE TABLE uses_ingredient(recipe_id int, name varchar(25));

チキンとクリームの両方を含むレシピのすべてのIDを返すクエリを作成したいと思います。

私が試してみました

SELECT recipe_id FROM uses_ingredient INNER JOIN  
(SELECT * FROM ingredient WHERE name="Chicken" OR name="Cream")  
USING (name) GROUP BY recipe_id  
HAVING COUNT(recipe_id) >= (SELECT COUNT(*) FROM theme);  

これは私に:「エラー1248(42000):すべての派生テーブルは独自のエイリアスを持っている必要があります」 とおそらく間違っています。

次にやってみました

SELECT recipe_id FROM 
(SELECT * FROM ingredient WHERE name="Chicken" OR name="Cream") AS t 
INNER JOIN uses_ingredient USING (name) 
GROUP BY recipe_id HAVING 
COUNT(recipe_id)>= (SELECT COUNT(*) FROM t);

これにより、「エラー1146(42S02):テーブル'recipedb.t'が存在しません」が表示されます。

ENGINE=MEMORYの使用を含む一時テーブルの作成を避けたい。

4

3 に答える 3

0

他の提案も良いですが、ここに別の方法があります。これは実際にクエリでやろうとしていたことのようです。同じ情報(名前)が「uses_ingredient」に含まれているように見えるのに、なぜ「ingredient」テーブルがあるのか​​わかりませんが。

SELECT recipe_id, count(*) c FROM uses_ingredient
WHERE name="Chicken" OR name="Cream"
GROUP BY recipe_id
HAVING c=2
于 2010-06-11T13:26:35.410 に答える
0

もっと良い考え方があるかもしれませんが、私は答えを 2 つのセットの交差点として見ています: チキンが入っているレシピとクリームが入っているレシピです。列の数以上を単純化した場合、これはうまくいかない可能性があります。しかし、いくつかのレコードで試してみましたが、問題ないようです。

SELECT CH.Recipe_Id
FROM
  (SELECT Recipe_Id
  FROM Uses_Ingredient
  WHERE Name = 'Chicken') CH
INNER JOIN 
  (SELECT Recipe_Id
  FROM Uses_Ingredient
  WHERE Name = 'Cream') CR
  ON CR.Recipe_Id = CH.Recipe_Id
于 2010-06-10T12:34:43.443 に答える
0

私は MJB に同意します。それは 2 つの集合の交点です。だから私はちょうど2つのセットを手に入れて、それらの両方に何が入っているか見てみたい.

SELECT *
    FROM recipe
    WHERE EXISTS (SELECT *
                      FROM uses_ingredient
                      WHERE uses_ingredient.recipe_id = recipe.recipe_id AND
                            uses_ingredient.name      = "Chicken") AND
          EXISTS (SELECT *
                      FROM uses_ingredient
                      WHERE uses_ingredient.recipe_id = recipe.recipe_id AND
                            uses_ingredient.name      = "Cream");
于 2010-06-11T13:10:46.703 に答える