MySQL объединяет результат операторов SELECT - PullRequest
0 голосов
/ 10 января 2019

Я не специалист по SQL, так что, возможно, я усложняю вещи, но здесь есть проблема. У меня есть система магазинов с 5 таблицами.

товары таблица содержит информацию обо всех товарах, которые были в магазине.

create table goods(
    id int unsigned not null auto_increment,
    name varchar(255) not null,
    code varchar(20) not null unique,
    sellingPrice float,
    primary key(id)
);

квитанция Таблица содержит информацию о покупках.

create table receipt(
    id int unsigned not null auto_increment,
    company varchar(255) not null,
    identifier varchar(50) unique,
    date date not null,
    price float not null,
    primary key(id)
);

эмитент_карты таблица содержит информацию о покупках.

create table issue_card(
    id int unsigned not null auto_increment,
    identifier varchar(50) unique,
    receiver varchar(255),
    date date not null,
    primary key(id)
);

товары и квитанции таблицы подключены (несколько товаров приобретаются одновременно)

create table goods_receipt (
    goods_id int unsigned not null,
    receipt_id int unsigned not null,
    amount int unsigned not null,
    inp_price float not null,
    foreign key (goods_id) references goods(id),
    foreign key (receipt_id) references receipt(id),
    CONSTRAINT goods_receipt_unique UNIQUE (goods_id, receipt_id)
);

товары и эмиссионная карточка подключены (несколько товаров продано одновременно)

create table issue_card_goods (
    goods_id int unsigned not null,
    issue_card_id int unsigned not null,
    amount int unsigned not null,
    foreign key (goods_id) references goods(id),
    foreign key (issue_card_id) references issue_card(id),
    CONSTRAINT goods_receipt_unique UNIQUE (goods_id, issue_card_id)
);

Что мне нужно выяснить, так это общее количество каждого товара в магазине в данный момент времени.

пример : 2015-01-04 - в магазине было 100 апельсинов (возможно, 100 000 были куплены до этого дня и 99 900 были проданы), и было 1000 бананов, ...

Мне удалось сделать следующее:

Получите вышеуказанный результат (считайте все элементы, но без ограничения по времени), создав это представление

CREATE VIEW store_items 
AS 
  SELECT main.id, 
         main.NAME, 
         main.code, 
         Ifnull(main.bought, 0) - Ifnull(sec.sold, 0) AS available, 
         main.sellingprice 
  FROM   (SELECT goods.id, 
                 goods.NAME, 
                 goods.code, 
                 Sum(goods_receipt.amount) AS bought, 
                 goods.sellingprice 
          FROM   goods 
                 LEFT JOIN goods_receipt 
                        ON goods.id = goods_receipt.goods_id 
          GROUP  BY code) AS main 
         JOIN (SELECT goods.code, 
                      Sum(issue_card_goods.amount) AS sold 
               FROM   goods 
                      LEFT JOIN issue_card_goods 
                             ON goods.id = issue_card_goods.goods_id 
               GROUP  BY code) AS sec 
           ON main.code = sec.code; 

Учитывая ограничение по времени, я создал 2 вида. В первом я объединяю квитанции с товарами.

CREATE VIEW store_items_sold_date 
AS 
  SELECT goods.id    AS id, 
         goods.code  AS code, 
         goods.NAME  AS NAME, 
         giss.amount AS amount, 
         giss.date   AS date_sold 
  FROM   (SELECT * 
          FROM   issue_card 
                 LEFT JOIN issue_card_goods 
                        ON issue_card.id = issue_card_goods.issue_card_id) AS 
         giss 
         LEFT JOIN goods 
                ON giss.goods_id = goods.id; 

Что дает мне дату и количество каждого проданного товара.

Второй вид аналогичен, только для покупок (соединение карты вопроса с товаром)

CREATE VIEW store_items_bought_date 
AS 
  SELECT goods.id   AS id, 
         goods.code AS code, 
         goods.NAME AS NAME, 
         gr.amount  AS amount, 
         gr.date    AS date_bought 
  FROM   (SELECT * 
          FROM   receipt 
                 LEFT JOIN goods_receipt 
                        ON receipt.id = goods_receipt.receipt_id) AS gr 
         LEFT JOIN goods 
                ON gr.goods_id = goods.id; 

Теперь я могу получить общее количество продаж и покупок отдельно для каждого товара.

SELECT id, 
       code, 
       NAME, 
       Sum(amount) AS bought 
FROM   store_items_bought_date 
WHERE  date_bought < "2015-04-05" 
GROUP  BY id; 

и

SELECT id, 
       code, 
       NAME, 
       Sum(amount) AS sold 
FROM   store_items_sold_date 
WHERE  date_sold < "2015-04-05" 
GROUP  BY id; 

Чего мне не хватает, так это объединить эти результаты. Я нашел этот запрос здесь на SO

(SELECT ... FROM tbl1 LEFT JOIN tbl2 ...) UNION ALL (SELECT ... FROM tbl1 RIGHT JOIN tbl2 ... WHERE tbl1.col IS NULL)

Но мне не удалось сопоставить его с упомянутыми результатами, проблема в том, что вместо tbl2 вместо таблицы есть оператор SELECT. Любая помощь будет оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...