2012-02-10 45 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的。

相关问题