Выберите идентификатор, связанный с двумя разными значениями другого столбца

#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. Вы правы, я не совсем понял одну вещь в решении, но теперь все ясно!