yurygolikov
@yurygolikov

Как получить записи с полным совпадением нужных значений в связи многие ко многим с помощью одного запроса?

Имеются две таблицы ingredient(ингредиент) и dish(блюдо). Между ними существует типичная связь many to many через промежуточную таблицу ingredient_dish.
Ко мне поступают данные - ингредиенты в неопределенном количестве. Мне нужно выбрать все блюда, у которых их ингредиенты включают в себя поступающие ингредиенты. Те найти блюда у которых есть все искомые ингредиенты
Мне нужно это сделать в одном запросе SQL. И я такой запрос уже сделал, он работает, но он очень громоздкий. Мне нужно будет для каждого искомого ингредиента делать по одному SELECT в подзапросе.
Можно ли как то оптимизировать данный запрос? Подскажите в сторону каких возможностей SQL рыть. Спасибо.

Тут идет поиск по ингредиентам 11 и 14. Получается при данном способе мне нужно каждый раз писать подзапрос SELECT под каждый ингредиент.
SELECT
    *
FROM
    `dish` AS d
WHERE

	11
IN 
	(

SELECT
	i.`id`
FROM 
	`ingredient_dish` as i_d
JOIN
	`ingredient` as i
ON 
	i_d.`ingredient_id` = i.`id`
WHERE 
	i_d.`dish_id` = d.`id`
	
	) 
	
AND

	14
IN 
	(

SELECT
	i.`id`
FROM 
	`ingredient_dish` as i_d
JOIN
	`ingredient` as i
ON 
	i_d.`ingredient_id` = i.`id`
WHERE 
	i_d.`dish_id` = d.`id`
	
	) 
;
  • Вопрос задан
  • 288 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `d`.*
  FROM (
    SELECT `dish_id`
      FROM `ingredient_dish`
      WHERE `ingredient_id` IN (11,14)
      GROUP BY `dish_id`
      HAVING COUNT(*) = 2
  ) AS `di` 
  JOIN `dish` AS `d` ON `d`.`id` = `di`.`dish_id`
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
thewind
@thewind
php программист, front / backend developer
Почитайте про INNER JOIN
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы