2014-09-21 30 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