2010-02-01 8 views
4

J'ai table de recettes et des ingrédients de table et d'ingrédients qui relient les ingrédients aux recettes.SQL "ContainsAll" requête

J'ai une liste d'ingrédients, comment écrire une déclaration SELECT (ou procédure de magasin) qui retournera une recette qui a TOUS les ingrédients donnés?

Comment écrire cette requête pour MySQL?

Répondre

3

Je pense que j'ai enfin une solution. :)

SELECT * 
FROM recipeTable r JOIN ingredintsTable i ON r.RecId= i.RecId 
WHERE i.IngredientId IN (1,2) 
GROUP BY r.id 
HAVING (COUNT(r.id) > 1) 
+0

Cela fonctionne très bien, c'est pourquoi j'ai choisi celui-ci. Je me demande lequel est le plus efficace? Le mien ou celui de Quassnoi? –

1
SELECT * 
FROM repice r 
WHERE EXISTS 
     (
     SELECT NULL 
     FROM ingredients i 
     WHERE i.recipe_id = r.id 
       AND i.ingredient_id IN (1, 2, 3, 4) 
     LIMIT 1 OFFSET 3 
     ) 

Le paramètre OFFSET doit être égal à n - 1, où n est le nombre d'ingrédients dans la liste.

Ceci suppose que la combinaison (recipe_id, ingredient_id) est unique.

1

Vous n'avez pas déclaré 'd' dans la clause HAVING. Je suppose que vous vouliez mettre "r" là-dedans.

+0

Vous avez raison. Merci! –