SQL查询通过中间表

Bry*_*Ash 18 sql join where relational-division

给出以下表格:

Recipes
| id | name
| 1  | 'chocolate cream pie'
| 2  | 'banana cream pie'
| 3  | 'chocolate banana surprise'

Ingredients
| id | name
| 1  | 'banana'
| 2  | 'cream'
| 3  | 'chocolate'

RecipeIngredients
| recipe_id | ingredient_id
|     1     |      2
|     1     |      3
|     2     |      1
|     2     |      2
|     3     |      1
|     3     |      3
Run Code Online (Sandbox Code Playgroud)

如何构建SQL查询以查找recipe.name ='chocolate'和ingredients.name ='cream'的配方?

OMG*_*ies 14

使用:

  SELECT r.name
    FROM RECIPES r
    JOIN RECIPEINGREDIENTS ri ON ri.recipe_id = r.id
    JOIN INGREDIENTS i ON i.id = ri.ingredient_id
                      AND i.name IN ('chocolate', 'cream')
GROUP BY r.name
  HAVING COUNT(DISTINCT i.name) = 2
Run Code Online (Sandbox Code Playgroud)

这里的关键点是计数必须等于成分名称的数量.如果它不是一个独特的计数,则由于重复而存在误报的风险.

  • @Bryan - RE:更容易理解.双重否定确实需要一点时间习惯.用英语重新表述它是说"选择那些食谱中没有成分的食谱(巧克力,奶油)." (3认同)

Mar*_*ith 10

这称为关系分裂.这里讨论了各种技术.

尚未给出的另一种选择是双重不存在

SELECT r.id, r.name
FROM Recipes r
WHERE NOT EXISTS (SELECT * FROM Ingredients i
                  WHERE name IN ('chocolate', 'cream')
                  AND NOT EXISTS
                      (SELECT * FROM RecipeIngredients ri
                       WHERE ri.recipe_id = r.id
                       AND ri.ingredient_id = i.id))
Run Code Online (Sandbox Code Playgroud)