2014-09-21 62 views
0

我有几个表:分组数据连接

products: id (int), name (varchar) 
colors: id (int), name (varchar) 
sizes: id (int), name (varchar) 
products_colors: color_id (int), product_id (int) 
products_sizes: size_id (int), product_id (int) 

我想只产生一个查询,返回所有的信息(而不是3个查询,1产品,1颜色和一个用于大小) 我发现,我能做些什么“体面”,使用GROUP_CONCAT但该查询返回的重复数据,不知道这是发生因为GROUP_CONCAT或JOINS

SELECT products.id, products.name, CONCAT("[", GROUP_CONCAT("'", colors.name, "'"), "]")  colors, CONCAT("[", GROUP_CONCAT("'", sizes.name, "'"), "]") sizes 
FROM products 
LEFT JOIN products_sizes ON products_sizes.product_id = products.id 
LEFT JOIN sizes ON sizes.id = products_sizes.size_id 
LEFT JOIN products_colors ON products_colors.product_id = products.id 
LEFT JOIN colors ON colors.id = products_colors.color_id 
GROUP BY products.id 

请注意,我正在使用CONCAT将分组数据格式化为JSON 如果在products_colors一根火柴products_sizes的数据在GROUP_CONCAT

我需要的,如果有可用的颜色或大小来回报所有产品无论复制

+0

尝试添加独特的group_concat函数吗? – 2014-09-21 02:25:28

回答

1

尝试加入不同的GROUP_CONCAT函数:

SELECT products.id, 
     products.name, 
     case when colors.name is null then '[]' else 
     CONCAT("[", GROUP_CONCAT(distinct "'", colors.name, "'"), "]") end as colors, 
     case when sizes.name is null then '[]' else 
     CONCAT("[", GROUP_CONCAT(distinct "'", sizes.name, "'"), "]") end as sizes 
    FROM products 
    LEFT JOIN products_sizes 
    ON products_sizes.product_id = products.id 
    LEFT JOIN sizes 
    ON sizes.id = products_sizes.size_id 
    LEFT JOIN products_colors 
    ON products_colors.product_id = products.id 
    LEFT JOIN colors 
    ON colors.id = products_colors.color_id 
GROUP BY products.id, products.name 
+0

德洛谢谢你! – handsome 2014-09-21 02:31:01

+0

可以避免NULL并添加[]来代替? – handsome 2014-09-21 02:32:18

+0

@handsome是,看编辑 – 2014-09-21 02:34:51