MySQl объединяет строки, где выполняется условие - PullRequest
1 голос
/ 09 мая 2011

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

У меня есть 3 таблицы. orders, orders_products и orders_products_attributes.

Я пытаюсь вернуть таблицу результатов для данного заказа, показывая все совпадающие продукты orders_products_attributes для того продукта, где он существует (иногда нет атрибутов)

Мне нужно сюда:

SELECT      oi.orders_id AS orderid
,           oi.products_id AS ItemNumber
,           oi.products_quantity AS Quantity
,           oi.final_price AS CostPerUnit
,       oi.products_name AS ItemTitle
,       concat (patt.products_options_id, '-', patt.products_options_values_id) AS OptionCodes
,       concat (patt.products_options, ': ', patt.products_options_values) AS OptionNames
FROM        orders_products oi
JOIN        orders o
ON      o.orders_id = oi.orders_id
LEFT JOIN   orders_products_attributes patt
ON          patt.orders_products_id = oi.orders_products_id AND patt.orders_id = oi.orders_id
WHERE       o.orders_status =2 AND oi.orders_id =10346
ORDER BY    ItemNumber

, который возвращает следующие результаты:

orderid ItemNumber Quantity CostPerUnit ItemTitle OptionCodes OptionNames

10346   140        1        319.9982    Item 1    3-5        Choice: A

10346   140        1        319.9982    Item 1    1-1        Choice2: B

10346   210        1        112.5000    Item 5    NULL       NULL

Я пытаюсь объединить строки, в которых ItemNumber совпадает, объединяя OptionCodes и OptionNames, где они существуют, чтобы в итоге получить:

orderid ItemNumber Quantity CostPerUnit ItemTitle OptionCodes OptionNames

10346   140        1        319.9982  Item 1   3-5, 1-1    Choice: A, Choice2: B

10346   210        1        112.5000  Item 5    NULL         NULL

Я пытался их GROUP_CONCAT, но удалось объединить все 3 строки.

Извините, если я медлительный, но я просто не могу двигаться дальше.

ТИА, Andrew

Ответы [ 2 ]

0 голосов
/ 09 мая 2011

Вы должны иметь возможность использовать GROUP_CONCAT, как вы сказали, но для того, чтобы сделать это, вы также должны GROUP BY ItemNumber.

0 голосов
/ 09 мая 2011

Вы можете группировать по уникальному ключу таблицы order_products. Поскольку я не был уверен, что это было, я просто сгруппировал все столбцы в предложении Select, кроме тех, в которых я использую Group_Concat.

Select oi.orders_id As orderid
    , oi.products_id As itemnumber
    , oi.products_quantity As quantity
    , oi.final_price As costperunit
    , oi.products_name As itemtitle
    , Group_Concat( Concat(patt.products_options_id, '-', patt.products_options_values_id) ) As optioncodes
    , Group_Concat( Concat(patt.products_options, ': ', patt.products_options_values) ) As optionnames
From orders_products oi
    Join orders o
        On o.orders_id = oi.orders_id
    Left Join orders_products_attributes patt
        On patt.orders_products_id = oi.orders_products_id 
            And patt.orders_id = oi.orders_id
Where o.orders_status =2 
    And oi.orders_id =10346
Group By oi.orders_id, oi.products_id
    , oi.product_quantity, oi.final_price, oi.products_name
Order By itemnumber
...