#sql #database
Вопрос:
Учитывая эти 3 таблицы:
dishes(id, name)
ingredient(id, name)
recipes(id_dish, id_ingredient)
Я хочу знать название блюд, в рецепте которых есть как ингредиент А, так и ингредиент В.
Это мой вопрос до сих пор:
SELECT name FROM dishes
JOIN recipes
ON dishes.id=recipes.id_dish
JOIN ingredient
ON recipes.id_ingredient=ingredient.id
WHERE ingredient.name ="A"
Если бы запрос состоял в том, чтобы найти блюда, в которых есть ингредиент A или B, я мог бы просто добавить ИЛИ ingredients.name=»B» в последней строке, но в этом случае я не могу добавить И ingredients.name=»B», потому что один и тот же ингредиент не может иметь двух разных названий.
Как я могу различить два разных ингредиента в этой ситуации, чтобы сделать правильный запрос?
Ответ №1:
Вы можете использовать агрегацию:
SELECT d.name
FROM dishes d JOIN
recipes r
ON d.id = r.id_dish JOIN
ingredient i
ON r.id_ingredient = i.id
WHERE i.name IN ('A', 'B')
GROUP BY d.name
HAVING COUNT(DISTINCT i.name) = 2;
Обратите внимание на использование псевдонимов таблиц, чтобы запрос было легче писать и читать.
Комментарии:
1. Спасибо! Является ли это единственным решением или может быть также способ дифференцировать ингредиенты в предложении where?
2. @Mizzet . . . Я не совсем понимаю, что ты имеешь в виду. Это действительно отличает ингредиенты в
WHERE
предложении.3. Вы правы, я не совсем понял одну вещь в решении, но теперь все ясно!