Ingredient ----------------- IngredientID Name Description Difficulty ...
En opskrift (Recipe) har relationer til en eller flere ingredienser (Ingredients). Samtidig kan en ingrediens være relateret til en eller flere opskrifter.
Jeg kunne godt tænke mig at hente opskrifter ud fra en eller flere ingredienser. F.eks. har jeg navnet på 3 ingredienser, og ønsker at få alle opskrifter, der har disse 3 ingredienser tilknyttet.
Problemet er jeg hele tiden ender med at få alle opskrifter hvor bare én af ingredienser er i - ikke alle 3.
select Recipe.Name as RecipeName from Recipe, RecipeIngredient, Ingredient where Recipe.RecipeID = RecipeIngredient.RecipeID and Ingredient.IngredientID = RecipeIngredient.RecipeID and Ingredient.Name = 'Pepper' or Ingredient.Name = 'Salt' or Ingredient.Name = 'Karry' group by Recipe.Name
select Recipe.Name as RecipeName from Recipe left join RecipeIngredient on Recipe.RecipeID = RecipeIngredient.RecipeID left join Ingredient on Ingredient.IngredientID = RecipeIngredient.RecipeID where Recipe.RecipeID in ( select RecipeIngredient.RecipeID from RecipeIngredient left join Ingredient on Ingredient.IngredientID = RecipeIngredient.IngredientID where Ingredient.Name = 'Salt' or Ingredient.Name = 'Pepper' or Ingredient.Name = 'Karry' group by RecipeIngredient.RecipeID
godt nok er det her ineffektiv SQL. men det virker og gør som du forventer.
select Recipe.Name as RecipeName from Recipe left join RecipeIngredient on Recipe.RecipeID = RecipeIngredient.RecipeID left join Ingredient on Ingredient.IngredientID = RecipeIngredient.RecipeID where Recipe.RecipeID in ( select RecipeIngredient.RecipeID from RecipeIngredient left join Ingredient on Ingredient.IngredientID = RecipeIngredient.IngredientID where Ingredient.Name = 'Salt' group by RecipeIngredient.RecipeID ) and Recipe.RecipeID in ( select RecipeIngredient.RecipeID from RecipeIngredient left join Ingredient on Ingredient.IngredientID = RecipeIngredient.IngredientID where Ingredient.Name = 'Pepper' group by RecipeIngredient.RecipeID ) and Recipe.RecipeID in ( select RecipeIngredient.RecipeID from RecipeIngredient left join Ingredient on Ingredient.IngredientID = RecipeIngredient.IngredientID where Ingredient.Name = 'Karry' group by RecipeIngredient.RecipeID ) group by Recipe.Name
jeg arbejder desværre ikke nok med SQL til, at have været inde over de mere effektive fremgangsmåder. men det kan sikkert gøres på en måde hvor man ikke behøver selecte 4 gange:-)
men det vil fungere fint.. du skal have mange rekords før det bliver mærkbart langsomt.
Den her giver samme resultat, men er i mine øjne lidt pænere.
SELECT Recipe.Name FROM Recipe LEFT JOIN RecipeIngredient ON Recipe.RecipeID = RecipeIngredient.RecipeId LEFT JOIN Ingredient ON RecipeIngredient.IngredientId = Ingredient.IngredientID WHERE Ingredient.Name = 'curry' OR Ingredient.Name = 'VAND' GROUP BY Recipe.Name HAVING COUNT(*) = 2
Hvis man vil søge efter opskrifter med præcis 4 ingredienser, skal man bare tilføje et par "OR Ingredient.Name = 'xxx'" i WHERE klausulen, og så justere COUNT-tallet til sidst. På denne måde, vil man rent faktisk også kunne finde de opskrifter der indeholder flest muligt ingredienser, kan man fjerne "HAVING COUNT(*) = X", og så sortere efter antallet i stedet for... sådan her:
SELECT Recipe.Name, COUNT(*) AS AntalIngrediensMatch FROM Recipe LEFT JOIN RecipeIngredient ON Recipe.RecipeID = RecipeIngredient.RecipeId LEFT JOIN Ingredient ON RecipeIngredient.IngredientId = Ingredient.IngredientID WHERE Ingredient.Name = 'curry' OR Ingredient.Name = 'VAND' OR Ingredient.Name = 'OST' GROUP BY Recipe.Name ORDER BY 2 DESC
SELECT Recipe.Name FROM Recipe LEFT JOIN RecipeIngredient ON Recipe.RecipeID = RecipeIngredient.RecipeId LEFT JOIN Ingredient ON RecipeIngredient.IngredientId = Ingredient.IngredientID WHERE Ingredient.Name = 'Karry' OR Ingredient.Name = 'Salt' GROUP BY Recipe.Name having COUNT(*) = 3
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.