SQL выставить три таблицы в один запрос - PullRequest
0 голосов
/ 09 января 2020

Здравствуйте,

У меня есть 3 таблицы:

CREATE TABLE `invoice` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `invoice` (`id`) VALUES
(1), 
(2), 
(3);

CREATE TABLE `invoice_deduction` (
  `id` int(11) NOT NULL,
  `invoiceId` int(11) NOT NULL,
  `deductionId` int(11) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (`invoiceId`) REFERENCES `invoice` (`id`),
  FOREIGN KEY (`deductionId`) REFERENCES `invoice` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `invoice_deduction` (`id`, `invoiceId`, `deductionId`) VALUES
(1, 2, 1),
(2, 3, 1),
(3, 3, 2);

CREATE TABLE `invoice_item` (
  `id` int(11) NOT NULL,
  `invoiceId` int(11) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (`invoiceId`) REFERENCES `invoice` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `invoice_item` (`id`, `invoiceId`) VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 2),
(5, 2),
(6, 3),
(7, 3),
(8, 3);

Например:

  • Первый счет-фактура содержит 3 позиции (всего: 3 позиции)
  • Второй счет-фактура содержит 3 позиции из первого счета-фактуры (вычет) и 2 новых позиции (всего: 5 позиций)
  • Третий счет содержит 3 элементы из первого счета-фактуры (вычет), 2 элемента из второго счета-фактуры (вычет) и 3 новых элемента (всего: 8 элементов)

Поэтому я хочу получить запрос с таким результатом:

id | count of items (with deductions)
3  | 8
2  | 5
1  | 3

Я начинаю с этого запроса:

SELECT 
    i.id, COUNT(*) as countItems
FROM
    invoice i JOIN invoice_item it ON i.id = it.invoiceId
GROUP BY
    it.invoiceId
ORDER BY 
    countItems
DESC

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 09 января 2020

Я думаю, что вы хотите совокупную сумму:

SELECT i.id, COUNT(*) as countItems,
       SUM(COUNT(*)) OVER (ORDER BY it.id)
FROM invoice i JOIN
     invoice_item it
     ON i.id = it.invoiceId
GROUP BY i.id
ORDER BY countItems;

Я понятия не имею, почему вы используете LEFT JOIN. Я не знаю, почему у вас будут invoiceId значения, которые не соответствуют действительному счету. Поэтому я переключил его на внутреннее соединение.

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