这看起来很简单,但出于某种原因,我不能让它做我想要的......
我有一个食谱网站,我希望能够根据它们是否包含多种成分来搜索食谱。我有两个表,其中一个包含所有配方信息,另一个表包含配料。这是我到目前为止,但它没有检索任何记录。任何帮助,将不胜感激。谢谢!
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
答案 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对(可能还有金额?)