在联接表中搜索多个条件

时间:2011-01-05 20:27:02

标签: sql

这看起来很简单,但出于某种原因,我不能让它做我想要的......

我有一个食谱网站,我希望能够根据它们是否包含多种成分来搜索食谱。我有两个表,其中一个包含所有配方信息,另一个表包含配料。这是我到目前为止,但它没有检索任何记录。任何帮助,将不胜感激。谢谢!

SELECT recipe.ID, recipe.Title, recipe.Photo FROM ingredient 
LEFT JOIN recipe ON ingredient.Recipe_ID = recipe.ID 
WHERE (ingredient.Description = 'egg' AND ingredient.Description = 'sugar' AND ingredient.Description = 'salt') 
GROUP BY recipe.ID 

4 个答案:

答案 0 :(得分:2)

如果您想要所有至少含有这3种成分的食谱,请尝试:

SELECT recipe.ID, recipe.Title, recipe.Photo FROM recipe
WHERE recipe.ID in (
  SELECT Recipe_ID
  FROM ingredient 
  WHERE ingredient.Description in ('egg', 'sugar', 'salt')
  HAVING count(distinct ingredient.Description) = 3
  GROUP BY Recipe_ID
)

答案 1 :(得分:1)

您没有收到任何结果,因为AND子句中的WHERE使其成为一个不可能的条件,因为您不会有一行描述所有值同时

答案 2 :(得分:0)

select recipe.ID, recipe.Title, recipe.Photo
from(
    select recipe.ID, recipe.Title, recipe.Photo
    ,count(ingredient.description) as num_ingredients 
    from ingredient left join recipe 
    on ingredient.recipe_id=recipe.ID
    group by 1,2,3
    )ingred_count
where num_ingredients>=2;

如果你想看看含有多种成分的食谱,那应该可以解决问题。否则,如果您想要每个配方的配料数量,请选择子查询。

答案 3 :(得分:0)

您的ingredient表似乎包含Recipe_ID。这实际上会使这个查询变得非常简单,因为您需要做的就是查看哪个Recipe_ID发生在多行中。

SELECT I.recipe_id
FROM ingredient I
WHERE COUNT(I.description) > 0
GROUP BY I.recipe_id

将为所有此类食谱提供ID。如果您想要的不只是ID,那么您需要加入

SELECT R.*
FROM ingredient I
INNER JOIN recipe R on I.recipe_id = R.id
WHERE COUNT(I.description) > 0
GROUP BY I.recipe_id

我强烈建议您查看一个多对多的表格,您可以将其命名为recipe_to_ingredient。这样你就有了一个表recipe,一个表ingredient和一个表recipe_to_ingredient,它们将有recipe_id / ingredient_id对(可能还有金额?)