2012-02-10 42 views
5

我正在做一個關於用PHP(Codeigniter)和MYSQL烹飪食譜的項目。如何選擇具有一個顏色和兩個不同屬性的行?

我有三個表:

  • Ingredients - idname
  • Recipe - idname
  • ing_to_rep - recipe_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

有可能是一個更有效的方式和更靈活的方式,但有兩個子查詢連接就可以了:

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 2012-02-10 15:28:18

+0

此解決方案有一個缺點:CI(ActiveRecord)不支持子查詢!看到我的子查詢免費的解決方案:) – uzsolt 2012-02-13 19:31:45

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 – 2012-02-10 17:30:09

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的。

相關問題