2012-02-10 12 views
5

私はPHP(Codeigniter)とMYSQLを使ってレシピを調理するプロジェクトを行っています。 idname -2つの異なる属性を持つ1つの列を持つ行を選択するにはどうすればよいですか?

  • Ingredients

    私は3つのテーブルを持っています。 idname

  • ing_to_rep - -
  • Reciperecipe_idingredient_idは(私はレシピを食材持って保持するために、この表を使用しています。)

は卵を持っている全てのレシピを得る」ためのクエリは何ですか(id = 64

)と塩(id = 65)」私が試した:

SELECT * FROM recipe JOIN ing_to_rep ON recipe.id = ing_to_rep.rep_id 
WHERE ing_to_rep.ing_id = 64 AND ing_to_rep.ing_id = 65 

もちろん、それは何も返しませんが、私がしようとしていることを得るのに役立ちます。

答えて

1

あり、より効率的な方法と、より柔軟な方法は、おそらくですが、2つのサブクエリがどうなる加入:

SELECT 
    recipe.* 
FROM recipe 
    JOIN (SELECT recipe_id FROM ing_to_rep WHERE ingredient_id = 64) AS ing1 ON recipe.id = ing1.recipe_id 
    JOIN (SELECT recipe_id FROM ing_to_rep WHERE ingredient_id = 65) AS ing2 ON recipe.id = ing2.recipe_id 

はまた、別の解決策のようなものだろうEXISTS

SELECT 
    recipe.* 
FROM 
    recipe 
WHERE 
    EXISTS (SELECT recipe_id FROM ing_to_rep ing1 WHERE ingredient_id = 64 AND recipe.id = ing1.recipe_id) 
    AND EXISTS (SELECT recipe_id FROM ing_to_rep ing2 WHERE ingredient_id = 65 AND recipe.id = ing2.recipe_id) 
+0

これらはどちらも本当にうまく機能しています。どうもありがとうございました! – dhargan

+0

このソリューションには欠点があります。CI(ActiveRecord)はサブクエリをサポートしていません!私のサブクエリフリーソリューションを参照してください:) – uzsolt

1

で行うことができます

SELECT * FROM recipe r JOIN 
(SELECT recipe_id FROM ing_to_rep 
GROUP BY recipe_id 
HAVING SUM(IF(ingredient_id IN (64, 65), 1, 0)) = 2) gr ON r.id = gr.recipe_id 

パフォーマンスに関してわからない場合は、自分で試してみてください。

+0

これは新しい方法です。 +1 –

0

サブクエリフリー法(CIのARは、サブクエリをサポートしていません):

SELECT * 
FROM recipe 
JOIN ing_to_rep ON (ing_to_rep.id_recipe=recipe.id AND (ing_to_rep.ing_id=64 OR ing_to_rep.ing_id=65)) 
GROUP BY recipe.id 
HAVING COUNT(ing_to_rep.ing_id)=2 

あなたはこのソリューションCIのはActiveRecordを使用することができます。

関連する問題