una manera diferente:
Version 2 (procedimiento almacenado) revisada
select r.name
from recipes r
where r.id = (select t1.recipe_id
from RecipeIngredients t1 inner join
RecipeIngredients t2 on t1.recipe_id = t2.recipe_id
and t1.ingredient_id = @recipeId1
and t2.ingredient_id = @recipeId2)
Editar 2: [antes de que la gente empiece a gritar] :)
Esto se puede colocar en la parte superior de la versión 2, lo que permitirá consultar por nombre en lugar de pasar la identificación.
select @recipeId1 = recipe_id from Ingredients where name = @Ingredient1
select @recipeId2 = recipe_id from Ingredients where name = @Ingredient2
He probado la versión 2, y funciona. ¡La mayoría de los usuarios se vincularon en la tabla Ingrediente, en este caso, no fue totalmente necesario!
Edición 3: (resultados de la prueba);
Cuando se ejecuta este procedimiento almacenado, estos son los resultados.
Los resultados son del formato (Primera receta_id, en segundo lugar receta_id, Resultado)
1,1, Failed
1,2, 'banana cream pie'
1,3, 'chocolate banana surprise'
2,1, 'banana cream pie'
2,2, Failed
2,3, 'chocolate cream pie'
3,1, 'chocolate banana surprise'
3,2, 'chocolate cream pie'
3,3, Failed
Es evidente que esta consulta no maneja caso cuando ambas restricciones son las mismas, pero funciona para todos los demás casos.
Editar 4: (manipulación caso misma restricción):
sustitución de esta línea:
r.id = (select t1...
a
r.id in (select t1...
obras con los casos fallidos para dar:
1,1, 'banana cream pie' and 'chocolate banana surprise'
2,2, 'chocolate cream pie' and 'banana cream pie'
3,3, 'chocolate cream pie' and 'chocolate banana surprise'
fyi ... La recetaIngredientes se llama MappingTable ... –
@Garis Suero: Hay * muchos * sinónimos - xref, búsqueda, mapeo, enlace - hay un nombre estándar definido para una tabla que proporciona una relación de muchos a muchos . –