Sql 在联接表中搜索多个条件

Sql 在联接表中搜索多个条件,sql,Sql,这似乎很简单,但出于某种原因,我无法让它做我想要的 我有一个食谱网站,我想能够搜索食谱的基础上,如果他们是否包含多种成分。我有两张桌子,一张是所有的食谱信息,另一张是配料。这是我到目前为止所拥有的,但它没有检索到任何记录。任何帮助都将不胜感激。谢谢 SELECT recipe.ID, recipe.Title, recipe.Photo FROM ingredient LEFT JOIN recipe ON ingredient.Recipe_ID = recipe.ID WHERE (in

这似乎很简单,但出于某种原因,我无法让它做我想要的

我有一个食谱网站,我想能够搜索食谱的基础上,如果他们是否包含多种成分。我有两张桌子,一张是所有的食谱信息,另一张是配料。这是我到目前为止所拥有的,但它没有检索到任何记录。任何帮助都将不胜感激。谢谢

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 

您没有得到任何结果,因为
WHERE
子句中的
使其成为不可能的条件,由于没有一行描述同时是所有这些值,因此没有结果,因为
where
子句中的
使其成为不可能的条件,因为没有一行描述同时是所有这些值

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;
如果你想看看含有多种成分的食谱,那就可以了。否则,如果您想要每个配方的配料数量,则使用子查询


如果你想看看含有多种成分的食谱,那就可以了。否则,如果您想要每个配方的配料数量,请执行子查询。

您的
配料表似乎包含
配方ID
。这实际上会使这个查询变得非常简单,因为您所需要做的就是查看哪个
Recipe\u 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

我强烈建议您查看一个多对多表,您可以将其命名为
配方\u to\u配料
。这样你就有了一个表
recipe
,一个表
component
和一个表
recipe\u-to\u-component
,其中将有配方id/成分id对(可能还有数量?)你的
成分
表似乎包含
配方id
。这实际上会使这个查询变得非常简单,因为您所需要做的就是查看哪个
Recipe\u 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

我强烈建议您查看一个多对多表,您可以将其命名为
配方\u to\u配料
。这样,您就有了一个表
配方
、一个表
配料
和一个表
配方到配料
,其中将有配方id/配料id对(可能还有数量?)

如果您想要所有配方都至少包含这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
)

如果您希望所有食谱至少包含这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
)

谷歌“关系部门”。谷歌“关系部门”。这是可行的。非常感谢您抽出时间回答@乔恩:太好了。你可以通过勾选旁边的复选框来“接受”这个答案。这是可行的。非常感谢您抽出时间回答@乔恩:太好了。你可以通过勾选旁边的复选框来“接受”这个答案。