2014-09-21 3 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 또는이

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 

그 난을 유의하시기 바랍니다 JOINS CONCAT을 사용하여 그룹화 된 데이터의 형식을 지정합니다. JSON 가 products_colors의 일치 및 데이터

내가 가능한 색상이나 크기가있는 경우 모든 제품 상관없이 반환하는 데 필요한 GROUP_CONCAT에 중복 products_sizes 경우

+0

group_concat 함수에 distinct를 추가 했습니까? –

답변

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

+0

NULL을 피하고 대신 []를 추가 할 수 있습니까? – handsome

+0

@handsome 예, 편집 –