Фильтр MySQL для многих-ко-многим

У меня есть много-ко-многим со следующими таблицами:

1) квитанции

-id -name 

2) ингредиенты

 -id -name 

3) поступления-ингредиенты

 -recept_id -ingredient_id 

Теперь я хочу найти квитанции, в которых есть список ингредиентов. Например, все квитанции, которые содержат ингредиенты «томатный» и «песто». (И не квитанции, которые имеют только «помидор» или «песто». Как будет выглядеть запрос?

Попробуй это

 SELECT r.id, r.name, GROUP_CONCAT(DISTINCT(i.name)) as items FROM receipts r LEFT JOIN receipts-ingredients ri ON(ri.receipt_id = r.id) LEFT JOIN ingredients i ON(ri.ingredient_id = i.id) GROUP BY r.id HAVING FIND_IN_SET('tomato',items) AND FIND_IN_SET('pesto',items) 

Нашел еще один рабочий ответ на голландской доске:

 SELECT r.id, r.name FROM receipts r JOIN receipts_ingredients ri ON r.id = ri.receipt_id JOIN ingredients i ON ri.ingredient_id = i.id WHERE i.name IN ('tomato', 'pesto') GROUP BY r.id HAVING COUNT(*) = 2 
 SELECT * FROM (SELECT * FROM ingredients AS i LEFT JOIN `receipts-ingredients` AS ri ON i.id=ri.ingredient_id LEFT JOIN receipts AS r ON ri.recept_id=r.id WHERE i.name='tomato') AS Tomato, JOIN (SELECT * FROM ingredients AS i LEFT JOIN `receipts-ingredients` AS ri ON i.id=ri.ingredient_id LEFT JOIN receipts AS r ON ri.recept_id=r.id WHERE i.name='pesto') AS Pesto ON Tomato.recept_id=Pesto.recept_id 

Это жестко запрограммированный подход (есть лучшие ответы), но вы также можете использовать его для конкретных данных (FYI: я добавил символ «i» в столбец «recept_id» таблицы «рецепты-ингредиенты»).

РЕДАКТИРОВАТЬ

Кроме того, вам может потребоваться установить обратные ссылки вокруг имени таблицы рецептов квитанций. Возможно, было бы неплохо переименовать его в receipts_ingredients.

 SELECT aa.id, aa.name AS receipts_name FROM receipts AS aa INNER JOIN `receipts-ingredients` AS bb ON aa.id = bb.receipt_id INNER JOIN ingredients AS cc ON cc.id = bb.ingredient_id INNER JOIN ( SELECT aa.id FROM receipts AS aa INNER JOIN `receipts-ingredients` AS bb ON aa.id = bb.receipt_id INNER JOIN ingredients AS cc ON cc.id = bb.ingredient_id WHERE cc.name = 'pesto' ) _aa ON aa.id = _aa.id WHERE cc.name = 'tomato'