2017-06-14 104 views
0

我有这样的查询:实现嵌套GROUP_CONCAT

select p.id, 
     p.price, 
     concat('[',group_concat(concat('{',concat_ws(',', concat('color:', pc.color),concat('sizeName:',cs.size_name)),'}')),']') as variety 

     from tbl_products as p 

    inner join tbl_product_colors as pc on p.id = pc.product_id 
    left join tbl_color_sizes as cs on pc.id = cs.product_color_id 

group by p.id; 

查询上述输出:

Id | price | variety 
1 | 1000 | [ {color:FFFFFF, sizeName:XL} , {color:FFFFFF, sizeName:X} ] 

但我的期望的输出是:

Id | price | variety 
1 | 1000 | [ {color:FFFFFF, sizes: [ {sizeName: XL} , {sizeName: L} ] } ] 

问题:如何在此上下文中使用group_concat或其他函数(除了JSON函数)来实现所需的输出?

+0

如果产品1有多种颜色,那么期望的输出是什么? – Uueerdo

+0

[{color:FFFFFF,sizes:[{sizeName:XL},{sizeName:L}]},{color:F2F2F2,sizes:[{sizeName:XL}]}] – Sajad

+0

这将是一个'字段值? – Uueerdo

回答

2

几乎在所有情况下,需要嵌套聚合的结果都需要“嵌套”查询。您可以在外部分组维度上分组的子查询中执行“大小列表”,并在外部查询中将这些字段分组在一起;然后在外部查询中将字段与“大小列表”连接在一起。

就像这样,但我为了可读性省略了大部分额外的CONCAT。

SELECT subQ.id, subQ.price 
    , GROUP_CONCAT(CONCAT(subQ.color, ': ', subQ.sizeList)) AS variety 
FROM (
    SELECT p.id, p.price, pc.color 
     , GROUP_CONCAT(cs.size_name) AS sizeList 
    FROM tbl_products AS p 
    INNER JOIN tbl_product_colors AS pc ON p.id = pc.product_id 
    LEFT JOIN tbl_color_sizes AS cs ON pc.id = cs.product_color_id 
    GROUP BY p.id, p.price, pc.color 
) AS subQ 
GROUP BY subQ.id, subQ.price 
;