Aide pour une requête d'intersection

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Salut à tous !

Pour un petit projet personnel en Symfony3, j'aurais besoin de votre aide afin d'écrire une requête SQL qui me semble un peu complexe.

J'ai trois tables :

  • Cocktail
  • Ingredient
  • CocktailIngredient qui fait le lien entre les deux (on a donc deux clés étrangères dedans, une pour cocktail, et l'autre pour cocktail_ingredient)

J'ai un système de recherche dans lequel je veux, à partir des IDs des ingrédients, récupérer tous les cocktails qui contiennent au moins ces ingrédients, donc qui contiennent par exemple l'ingérdient 1 et l'ingrédient 2 et l'ingrédient 3… Qu'ils en contiennent d'autres ou pas, je m'en fiche un peu.

D'après mes recherches, cela correspond à une requête de type INTERSECT. Celle-ci n'a pas l'air d'être disponible sous mySQL, ce n'est pas trop grave je peux switcher sur postgreSQL. J'ai toutefois du mal à voir comment réaliser la requête… Est-ce que quelqu'un pourrait me donner un petit coup de pouce ? :)

Merci d'avance !

+0 -0

Je ne sais pas si c'est la meilleure méthode :

1
2
3
4
5
6
7
SELECT cocktail.name
FROM CocktailIngredient
LEFT JOIN cocktail ON cocktail.cocktail_id = CocktailIngredient.cocktail_id
LEFT JOIN ingredient ON ingredient.ingredient_id = CocktailIngredient.ingredient_id
WHERE CocktailIngredient.ingredient_id IN (1,7)
GROUP BY CocktailIngredient.cocktail_id
HAVING COUNT(CocktailIngredient.cocktail_id) >= 2

Tu récupères avec le WHERE IN (équivalent à OR) les cocktails contenant tel OU tel ingrédient et ensuite tu gardes uniquement ceux dont le résultat est supérieur ou égal au nombre "d'id_ingredient" (ici 2 car "1" et "7") dans la dernière ligne avec HAVING COUNT.

HTTP/1.1 418 I'm a teapot

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte