MySQl合并条件为真的行

时间:2011-05-09 16:14:47

标签: mysql merge group-concat

我花了几天的时间试图以有限的成功解决这个问题,我确信这是一个简单的答案但是到目前为止没有运气,尽管进行了大量的研究,我担心这个问题是我有限的SQL知识。

我有3张桌子。 orders,orders_products和orders_products_attributes。

我正在尝试返回给定订单的结果表,显示所有匹配的orders_products,并合并该产品所在的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行。

对不起,如果我很慢,但我似乎无法继续前进。

TIA, 安德鲁

2 个答案:

答案 0 :(得分:0)

您可以按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

答案 1 :(得分:0)

您应该像您说的那样使用GROUP_CONCAT,但为了这样做,您还必须GROUP BY ItemNumber