sql запрос работает только для 1 записи - PullRequest
0 голосов
/ 09 октября 2018

Я действительно новичок в SQL - с 1 недели, и мой запрос работает только для 1 записи

Select m.meal_id, m.name, m.usp, m.description, m.worktime, m.proprietor, m.img, m.url, m.servings, d.name, c.name, s.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
join difficulty d on d.difficulty_id = m.difficulty_id
join cat c on c.cat_id = m.cat_id
join social s on s.social_id = m.social_id
and m.meal_id = 1

Этот запрос работает для одной записи, но если я хочу, чтобы все блюда (безфункция "и") Я все еще получаю только одну запись, но сумма едыPrice указана для всех добавленных записей, как мне получить этот запрос для всех блюд?

Мне нравится для каждого приема пищи одна запись с общей суммой едыPrice

мои столы:

    create table meals
(
    meal_id int unsigned not null auto_increment primary key,
    name varchar(100) not null,
    usp varchar(100) not null,
    description varchar(500) not null,
    worktime varchar(100) not null,
    proprietor varchar(100) not null,
    img varchar(100) not null,
    url text not null,
    servings int not null,
    difficulty_id int unsigned not null,
    cat_id int unsigned not null,
    social_id int unsigned not null,
    foreign key (difficulty_id) references difficulty (difficulty_id),
    foreign key (cat_id) references cat (cat_id),
    foreign key (social_id) references social (social_id)
);

create table ingredients
(
    ingredient_id   int unsigned not null auto_increment primary key,
    name varchar(45) not null,
    minamount float not null,
    price float not null
);

create table recipe
(
    meal_id int unsigned not null,
    ingredient_id int unsigned not null,
    quantity float,
    primary key (meal_id, ingredient_id),
    foreign key (meal_id) references meals (meal_id),
    foreign key (ingredient_id) references ingredients (ingredient_id)

);

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

вам нужен запрос ниже, перекрестное объединение поможет вам получить желаемый результат

Select m.meal_id, 
       m.name, 
       m.usp, 
       m.description, 
       m.worktime, 
       m.proprietor, 
       m.img, 
       m.url, 
       m.servings, 
       d.name, 
       c.name, 
       s.name, 
       (@s := @s + (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
join difficulty d on d.difficulty_id = m.difficulty_id
join cat c on c.cat_id = m.cat_id
join social s on s.social_id = m.social_id 
CROSS JOIN ( select @s:= 0) AS t 
0 голосов
/ 09 октября 2018

РЕДАКТИРОВАТЬ: На основе последние изменения по OP;вам нужно просто сделать GROUP BY.

Попробуйте:

Select m.meal_id, 
       m.name, 
       m.usp, 
       m.description, 
       m.worktime, 
       m.proprietor, 
       m.img, 
       m.url, 
       m.servings, 
       d.name, 
       c.name, 
       s.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
join difficulty d on d.difficulty_id = m.difficulty_id
join cat c on c.cat_id = m.cat_id
join social s on s.social_id = m.social_id 
GROUP BY m.meal_id, 
         m.name, 
         m.usp, 
         m.description, 
         m.worktime, 
         m.proprietor, 
         m.img, 
         m.url, 
         m.servings, 
         d.name, 
         c.name, 
         s.name 

Основано на Предыдущая версия Проблемы ОП:

Это оконная функция проблема.В новых версиях MySQL (> = 8.0 ) вы можете легко это сделать.В более старой версии (ваша версия 5.5) мы можем решить ее, используя переменные сеанса .

Попробуйте:

Select m.meal_id, 
       m.name, 
       m.usp, 
       m.description, 
       m.worktime, 
       m.proprietor, 
       m.img, 
       m.url, 
       m.servings, 
       d.name, 
       c.name, 
       s.name, 
       (@sum := @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
join difficulty d on d.difficulty_id = m.difficulty_id
join cat c on c.cat_id = m.cat_id
join social s on s.social_id = m.social_id 
CROSS JOIN (select @sum := 0) AS init 

В версии MySQL> = 8.0мы могли бы использовать SUM() в качестве оконной функции над разделом полного набора результатов.В этом случае запрос будет:

Select m.meal_id, 
       m.name, 
       m.usp, 
       m.description, 
       m.worktime, 
       m.proprietor, 
       m.img, 
       m.url, 
       m.servings, 
       d.name, 
       c.name, 
       s.name, 
       SUM(i.price / i.minamount * r.quantity) OVER() 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
join difficulty d on d.difficulty_id = m.difficulty_id
join cat c on c.cat_id = m.cat_id
join social s on s.social_id = m.social_id 
...