sql group by - проклятие и благословение - PullRequest
0 голосов
/ 22 ноября 2018

Эй, у меня есть 3 таблицы для расчета еды.

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
);

Теперь мне нравится находить еду по ингредиентам:

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

, которые дают мне список вроде:

name, ingredientName
Lasagne, meat
Bolognese, meat

Также мне нравится находить еду по цене, например:

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 

, которая дает мне список вроде:

name, mealPrice
Lasagne, 6.5
Bolognese, 7.8

Теперь позвольте мне построить запрос типа

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

Который дает мне список вроде:

name, ingredientName, mealPrice
Lasagne, meat, 1.99
Bolognese, meat, 1.99

Потому что (i.price / i.minamount * r.quanitity) для этого блюда для мяса составляет 1,99

Без «GROUP BY r.ingredientName» он возвращает только одно значение

name, ingredientName, mealPrice
Lasagne, meat, 6.5

Но мне нужен список вроде:

name, ingredientName, mealPrice
Lasagne, meat, 6.5
Bolognese, meat, 7.8

Я действительно действительно новичок в SQL (нужен этот запросв моем API для проекта Android ..), и я не знаю, как создать запрос для этого, нужно ли мне что-то вроде переменной или подзапроса, которого я не знаю ....

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Возможно, добавьте СУЩЕСТВУЮ, чтобы получить только блюда с «мясом» в рецепте.

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
0 голосов
/ 22 ноября 2018

Попробуйте это

                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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...