Mysql Sum или Group concat base с отличным идентификатором - PullRequest
0 голосов
/ 31 мая 2018

Я уверен, что кто-то уже задавал этот вопрос где-то, но, похоже, не может его найти.

Возможно ли в mysql сделать sum или group concat (AGGREGATE FUNCTION) в сочетании с отличным?

Пример: у меня есть продукт заказа, который может иметь много вариантов и много бенефициаров.Как можно в одном запросе (без использования подзапроса) получить список опций, сумму цены опциона и список бенефициаров?

Я создал примерный набор данных:

CREATE TABLE `order`
(id INT NOT NULL PRIMARY KEY);

CREATE TABLE order_product 
(id INT NOT NULL PRIMARY KEY
,order_id INT NOT NULL
);
CREATE TABLE order_product_options 
(id INT NOT NULL PRIMARY KEY
,title VARCHAR(20) NOT NULL
,price INT NOT NULL
,order_product_id INT NOT NULL
);

CREATE TABLE order_product_beneficiary 
(id INT NOT NULL PRIMARY KEY 
,name VARCHAR(20) NOT NULL
,order_product_id INT NOT NULL
);

INSERT INTO `order` (`id`) VALUES (1);
INSERT INTO `order_product` (`id`, `order_id`) VALUES (1, 1);
INSERT INTO `order_product_options` (`id`, `title`, `price`, `order_product_id`) 
VALUES  (1,'option1', 1, 1), (2, 'option2', 2, 1), (3, 'option3', 3, 1), (4, 'option3', 3, 1);

INSERT INTO `order_product_beneficiary` (`id`, `name`, `order_product_id`) 
VALUES  (1,'mark', 1), (2, 'jack', 1), (3, 'jack', 1);

http://sqlfiddle.com/#!9/37e383/2

Результат, который я хотел бы получить:

  1. id: 1
  2. options: option1, option2, option3, option3
  3. опционная цена: 9
  4. бенефициары: марка, джек, джек

Возможно ли это в MySQL без использования подзапросов?(Я знаю, что это возможно в оракуле) Если это возможно, как бы вы это сделали?

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Исходя из вашего описания, я думаю, вы просто хотите DISTINCT в GROUP_CONCAT().Однако это не сработает из-за дубликатов (как объяснено в комментарии, но не в вопросе).

Одним из решений является включение идентификаторов в результаты:

SELECT op.id,
       GROUP_CONCAT(DISTINCT opo.title, '(', opo.id, ')' SEPARATOR ', ') AS options,
       SUM(opo.price) AS options_price,
       GROUP_CONCAT(DISTINCT opb.name, '(', opb.id, ')' SEPARATOR ', ') AS 'beneficiaries'
FROM order_product op INNER JOIN
      order_product_options opo
      ON opo.order_product_id = op.id INNER JOIN
      order_product_beneficiary opb 
      ON opb.order_product_id = op.id
GROUP BY op.id;

Этоэто не совсем ваши результаты, но этого может быть достаточно.

РЕДАКТИРОВАТЬ:

О, я вижу.Вы объединяетесь в двух разных измерениях и получаете декартово произведение.Решение состоит в агрегировании до присоединения :

SELECT op.id, opo.options, opo.options_price,
       opb.beneficiaries
FROM order_product op INNER JOIN
     (SELECT opo.order_product_id,
             GROUP_CONCAT(opo.title SEPARATOR ', ') AS options,
             SUM(opo.price) AS options_price
      FROM order_product_options opo
      GROUP BY opo.order_product_id
     ) opo
     ON opo.order_product_id = op.id INNER JOIN
     (SELECT opb.order_product_id,
             GROUP_CONCAT(opb.name SEPARATOR ', ') AS beneficiaries
      FROM order_product_beneficiary opb 
      GROUP BY opb.order_product_id
     ) opb
     ON opb.order_product_id = op.id;

Здесь - это скрипта SQL.

0 голосов
/ 31 мая 2018

Примерно так: сделайте суммирование цен во внутреннем запросе, а затем присоединитесь к таблице order_product.

SELECT 
    op.id,
    MAX(opo.title) AS 'options',
    MAX(opo.price) AS 'options price',
    GROUP_CONCAT(opb.name SEPARATOR ', ') AS 'beneficiaries'
FROM
    order_product op
INNER JOIN (
    SELECT order_product_id, SUM(price) price, GROUP_CONCAT(title SEPARATOR ', ') title
    FROM order_product_options
    GROUP BY order_product_id 
) opo ON opo.order_product_id = op.id
INNER JOIN order_product_beneficiary opb ON opb.order_product_id = op.id
GROUP BY op.id

Демо

...