Mysql присоединился к запросу неверные и умноженные результаты - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь написать запрос, чтобы получить следующие результаты:

------------+------------+-------+------+-------+--------+--------+--------
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

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