Любой рецепт, который удовлетворяет условию в качестве ингредиента, отличного от 307.
То есть, для этого запроса не имеет значения, является ли один из ингредиентов 307, если в рецепте есть некоторыедругой ингредиент, кроме 307, это совпадение.
Чтобы получить рецепты, в которых ингредиент не имеет 307, мы можем использовать анти-соединение или НЕ СУЩЕСТВУЮЩИЙ
шаблон анти-объединения
SELECT r.id
, r.url
FROM recipes r
LEFT
JOIN recipe_ingredients s
ON s.fk_recipe = r.id
AND s.fk_ingredient = 307
WHERE s.fk_ingredient IS NULL
-или-
шаблон не существует
SELECT r.id
, r.url
FROM recipes r
WHERE NOT EXISTS
( SELECT 1
FROM recipe_ingredients s
WHERE s.fk_recipe = r.id
AND s.fk_ingredient = 307
)
FOLLOWUP
Чтобы вернуть рецепты, которые не имеют 307 в качестве ингредиента, но do имеют 42 в качестве ингредиента ...
SELECT r.id
, r.url
FROM recipes r
JOIN recipe_ingredients t
ON t.fk_recipie = r.id
AND t.fk_ingredient = 42
LEFT
JOIN recipe_ingredients s
ON s.fk_recipe = r.id
AND s.fk_ingredient = 307
WHERE s.fk_ingredient IS NULL
-или-
SELECT r.id
, r.url
FROM recipes r
WHERE NOT EXISTS
( SELECT 1
FROM recipe_ingredients s1
WHERE s1.fk_recipe = r.id
AND s1.fk_ingredient = 307
)
AND EXISTS
( SELECT 1
FROM recipe_ingredients s2
WHERE s2.fk_recipe = r.id
AND s2.fk_ingredient = 42
)