Я пытаюсь выполнить запрос ниже MYsql, запрос выполняется слишком долго. Мне нужно извлечь для каждого поставщика:
- total_purchases
- total_sales
Если у поставщика начальный баланс отличается от нуля, используйте его в предложении where в подзапросы, в противном случае используйте '2020-01-01'
Вот запрос, который я использую:
SELECT
sup.name AS supplier_name,
sup.id AS supplier_id,
sup.opening_balance_date,
sup.opening_balance AS opening_balance,
(
SELECT
IFNULL(SUM(pop.quantity * pop.cost),0) AS total_purchases
FROM purchase_order_products pop
JOIN purchase_order po ON
pop.purchase_order_id = po.id
WHERE
DATE(po.created_at) >= IFNULL(sup.opening_balance_date, '2020-01-01')
AND DATE(po.created_at) < '2020-03-01'
AND po.status = 'approved'
AND po.supplier_id = sup.id
) as total_purchases,
(
SELECT
IFNULL(sum(soi.total_cost),0) AS total_sales
FROM
sales_order_item soi
JOIN sales_order so use index (date_status_completed) ON
so.id = soi.sales_order_id
WHERE
soi.total_cost > 0
AND soi.supplier_id = sup.id
AND so.order_status = 'complete'
AND so.completed_returned = 0
AND so.desired_delivery_date >= IFNULL(sup.opening_balance_date, '2020-01-01')
) AS total_sales
FROM supplier sup
WHERE sup.is_active = 1
group by sup.id
ORDER BY sup.name;
Если я выполню запрос без указанного ниже подзапроса, он получит 0.5 se c который принят.
(
SELECT
IFNULL(sum(soi.total_cost),0) AS total_sales
FROM
sales_order_item soi
JOIN sales_order so use index (date_status_completed) ON
so.id = soi.sales_order_id
WHERE
soi.total_cost > 0
AND soi.supplier_id = sup.id
AND so.order_status = 'complete'
AND so.completed_returned = 0
AND so.desired_delivery_date >= IFNULL(sup.opening_balance_date, '2020-01-01')
) AS total_sales
Я думаю, что проблема здесь: soi.supplier_id = sup.id
вот объяснение 
и здесь база данных 
Создать запрос:
--
-- Table structure for table `purchase_order`
--
CREATE TABLE `purchase_order` (
`id` int(11) NOT NULL,
`supplier_id` int(11) NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`status` varchar(150) DEFAULT 'Pending',
`total` float NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `purchase_order_products`
--
CREATE TABLE `purchase_order_products` (
`id` int(11) NOT NULL,
`purchase_order_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`quantity` int(50) NOT NULL,
`cost` decimal(15,3) NOT NULL,
`reporting_quantity` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `sales_order`
--
CREATE TABLE `sales_order` (
`id` varchar(20) NOT NULL,
`order_status` varchar(50) DEFAULT NULL,
`desired_delivery_date` date DEFAULT NULL,
`completed_returned` int(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `sales_order_item`
--
CREATE TABLE `sales_order_item` (
`id` varchar(20) NOT NULL,
`sales_order_id` varchar(20) NOT NULL,
`total_cost` float NOT NULL DEFAULT '0',
`supplier_id` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `supplier`
--
CREATE TABLE `supplier` (
`id` int(11) NOT NULL,
`name` varchar(400) NOT NULL,
`opening_balance` decimal(10,2) NOT NULL DEFAULT '0.00',
`opening_balance_date` date DEFAULT NULL,
`is_active` tinyint(4) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Indexes for dumped tables
--
--
-- Indexes for table `credit_note`
--
-- Indexes for table `purchase_order`
--
ALTER TABLE `purchase_order`
ADD PRIMARY KEY (`id`),
ADD KEY `id` (`id`),
ADD KEY `supplier_id` (`supplier_id`),
ADD KEY `created_at` (`created_at`,`status`),
ADD KEY `supplier_id_2` (`supplier_id`,`created_at`),
ADD KEY `id_date_status` (`supplier_id`,`created_at`,`status`) USING BTREE;
--
-- Indexes for table `purchase_order_products`
--
ALTER TABLE `purchase_order_products`
ADD PRIMARY KEY (`id`),
ADD KEY `purchase_order_id` (`purchase_order_id`),
ADD KEY `product_id` (`product_id`),
ADD KEY `cost` (`cost`,`reporting_quantity`);
--
-- Indexes for table `sales_order`
--
ALTER TABLE `sales_order`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `idx_id` (`id`),
ADD KEY `idx_desired_delivery_date` (`desired_delivery_date`),
ADD KEY `date_status_completed` (`order_status`,`desired_delivery_date`,`completed_returned`) USING BTREE,
ADD KEY `completed_returned` (`completed_returned`),
ADD KEY `order_status` (`order_status`),
ADD KEY `order_status_2` (`order_status`,`completed_returned`);
--
-- Indexes for table `sales_order_item`
--
ALTER TABLE `sales_order_item`
ADD PRIMARY KEY (`id`),
ADD KEY `sales_order_id` (`sales_order_id`),
ADD KEY `reporting_supplier` (`supplier_id`) USING BTREE,
ADD KEY `total_cost` (`total_cost`),
ADD KEY `supplier_cost` (`supplier_id`,`total_cost`) USING BTREE,
ADD KEY `supplier_id` (`supplier_id`);
--
-- Indexes for table `supplier`
--
ALTER TABLE `supplier`
ADD PRIMARY KEY (`id`),
ADD KEY `id` (`id`),
ADD KEY `is_active` (`is_active`);
--
-- AUTO_INCREMENT for table `purchase_order`
--
ALTER TABLE `purchase_order`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=26763;
--
-- AUTO_INCREMENT for table `purchase_order_products`
--
ALTER TABLE `purchase_order_products`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=41884;
--
-- AUTO_INCREMENT for table `supplier`
--
ALTER TABLE `supplier`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=182;