I have 3 tables for a meal calculation.
x
CREATE TABLE Meals (
meal_id int,
name text
);
CREATE TABLE Ingredients (
ingredient_id int,
name text,
minamount float,
price float
);
CREATE TABLE Recipe (
meal_id int,
ingredient_id int,
quantitiy float,
ingredientName text
);
Now I like to find a meal by ingredient:
SELECT m.meal_id,
m.name,
r.ingredientName
from meals m
join recipe r on m.meal_id = r.meal_id
join ingredients i on i.ingredient_id = r.ingredient_id
where r.ingredientName = 'meat'
group by m.meal_id
Which give me a list like:
name, ingredientName
Lasagne, meat
Bolognese, meat
Also I like to find meal by price like:
SELECT m.meal_id,
m.name,
SUM(i.price / i.minamount * r.quantity) as mealPrice
from meals m
join recipe r on m.meal_id = r.meal_id
join ingredients i on i.ingredient_id = r.ingredient_id
GROUP BY m.meal_id,
m.name
HAVING mealPrice > 5.0 AND mealPrice < 8.0
Which give me a list like:
name, mealPrice
Lasagne, 6.5
Bolognese, 7.8
Now let me build a query like
SELECT m.meal_id,
m.name,
r.ingredientName,
SUM(i.price / i.minamount * r.quantity) as mealPrice
from meals m
join recipe r on m.meal_id = r.meal_id
join ingredients i on i.ingredient_id = r.ingredient_id
where r.ingredientName = 'meat'
GROUP BY m.meal_id
r.ingredientName
HAVING mealPrice > 5.0 AND mealPrice < 8.0
Which gives me a list like:
name, ingredientName, mealPrice
Lasagne, meat, 1.99
Bolognese, meat, 1.99
Because (i.price / i.minamount * r.quanitity) for this meal for meat is 1.99
Without “GROUP BY r.ingredientName” it returns only one values
name, ingredientName, mealPrice
Lasagne, meat, 6.5
But I need a list like:
name, ingredientName, mealPrice
Lasagne, meat, 6.5
Bolognese, meat, 7.8
Advertisement
Answer
Perhaps add an EXISTS to only get the meals with ‘meat’ in the recipe.
SELECT
m.meal_id, m.name,
SUM((i.price / i.minamount) * r.quantity) as mealPrice
FROM meals m
JOIN recipe r ON r.meal_id = m.meal_id
JOIN ingredients i ON i.ingredient_id = r.ingredient_id
WHERE EXISTS
(
SELECT 1
FROM recipe r2
WHERE r2.ingredientName = 'meat'
AND r2.meal_id = m.meal_id
)
GROUP BY m.meal_id, m.name
HAVING mealPrice BETWEEN 5.01 AND 7.99