Я пытаюсь написать запрос, чтобы получить следующие результаты:
------------+------------+-------+------+-------+--------+--------+--------
combined_id | sets_count | model | name | brand | place1 | place2 | the_item
------------+------------+-------+------+-------+--------+--------+--------
7683 3 baz foo bar 40 22 7683
---------------------------------------------------------------------------
Но мой запрос повторяет суммарный процесс для place1 и place2, поэтому он получает значения 120 и 66 вместо 40 и 22.Оказывается, он повторяется для количества компонентов, но не должен этого делать. Он суммируется только один раз:
------------+------------+-------+------+-------+--------+--------+--------
combined_id | sets_count | model | name | brand | place1 | place2 | the_item
------------+------------+-------+------+-------+--------+--------+--------
7683 3 baz foo bar 120 66 7683
---------------------------------------------------------------------------
Ниже приведены таблицы и запрос, который дает неправильный результат:
таблица 1
CREATE TABLE IF NOT EXISTS `combined_products` (
`combined_id` int(11) NOT NULL,
`component_id` int(11) NOT NULL,
`set_id` int(11) NOT NULL,
`amount` int(11) NOT NULL,
PRIMARY KEY (`combined_id`,`component_id`,`set_id`),
KEY `amount` (`amount`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `combined_products` (`combined_id`, `component_id`, `set_id`, `amount`) VALUES
(7683, 6798, 1, 1),
(7683, 7420, 1, 1),
(7683, 9979, 2, 1);
таблица2
CREATE TABLE IF NOT EXISTS `product_details` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
`brand` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
`model` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `name` (`name`),
KEY `brand` (`brand`),
KEY `model` (`model`)
) ENGINE=InnoDB AUTO_INCREMENT=7993 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `product_details` (`ID`, `name`, `brand`, `model`) VALUES
(7683, 'foo', 'bar', 'baz');
таблица3
CREATE TABLE IF NOT EXISTS `z_amount` (
`wr_id` int(11) NOT NULL,
`item` int(11) NOT NULL,
`amount` double NOT NULL DEFAULT '0',
`place` varchar(6) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`wr_id`),
KEY `item` (`item`),
KEY `amount` (`amount`),
KEY `place` (`place`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `z_amount` (`wr_id`, `item`, `amount`, `place`) VALUES
(253, 7683, 1, 'place2'),
(170, 7683, 22, 'place2'),
(123, 7683, 23, 'place2'),
(165, 7683, 30, 'place1'),
(7, 7683, 27, 'place1'),
(257, 7683, 2, 'place1'),
(256, 7683, 2, 'place1'),
(231, 7683, 2, 'place1'),
(230, 7683, 2, 'place1'),
(228, 7683, 1, 'place1'),
(229, 7683, 1, 'place1'),
(249, 7683, 7, 'place1'),
(250, 7683, 7, 'place1'),
(261, 7683, 1, 'place1'),
(262, 7683, 1, 'place1');
таблица4
CREATE TABLE IF NOT EXISTS `warehouse` (
`id_wr` int(11) NOT NULL,
`cond1` tinyint(4) DEFAULT '0',
`cond2` tinyint(4) DEFAULT '0',
`cond3` tinyint(4) DEFAULT '0',
PRIMARY KEY (`id_wr`),
KEY `cond1` (`cond1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `warehouse` (`id_wr`, `cond1`, `cond2`, `cond3`) VALUES
(253, 0, 0, 1),
(170, 1, 0, 1),
(123, 0, 0, 0),
(171, 0, 0, 1),
(259, 0, 0, 1),
(165, 0, 0, 0),
(7, 1, 0, 1),
(257, 1, 0, 1),
(256, 0, 0, 0),
(231, 1, 0, 1),
(230, 0, 0, 0),
(228, 1, 0, 1),
(229, 0, 0, 0),
(249, 1, 0, 1),
(250, 0, 0, 0),
(261, 1, 0, 1),
(262, 0, 0, 0),
(272, 1, 0, 1),
(273, 0, 0, 0);
Запрос, которыйвыдает неправильный результат:
SELECT
t1.combined_id,
COUNT(t1.set_id) AS sets_count,
t2.Model,
t2.Name,
t2.brand,
t5.*
FROM
combined_products t1
JOIN product_details t2 ON t1.combined_id = t2.ID
LEFT JOIN
(
SELECT
SUM(CASE
WHEN t3.place = 'place1' THEN t3.amount
ELSE 0
END) AS 'place1',
SUM(CASE
WHEN t3.place = 'place2' THEN t3.amount
ELSE 0
END) AS 'place2',
t3.item as the_item
FROM combined_products b
LEFT JOIN z_amount t3 ON b.combined_id=t3.item
LEFT JOIN warehouse t4 ON t3.wr_id=t4.id_wr
WHERE (t4.cond1='1' OR (t4.cond2='1' AND t4.cond3='1')) GROUP BY t3.item
) t5 ON t1.combined_id = t5.the_item
GROUP BY
t1.combined_id
Я попробовал другой подход, который возвращает правильные результаты, но запрос слишком медленный (1-2 секунды на локальном хосте с 10 записями в таблице комбинированных_продуктов, 4000 записей в таблице product_details, 270717 записей втаблица z_amount, 166 записей в таблице склада).Запрос с правильными результатами: http://sqlfiddle.com/#!9/f1d1d8/2