Search code examples
mysqlnullcasegroup-concatconcat-ws

MYSQL GROUP_CONCAT CONCAT_WS and handle NULL values


How to handle rows with NULL values especial from here (this is only one place when values can be NULL, because products don't have any attributes):

GROUP_CONCAT(DISTINCT (CONCAT_WS (': ', GroupAttrLang.`name`, AttrLang.`name`)) ORDER BY AttrLang.`name` ASC

This is part from my BIG query:

SELECT
TProduct.`reference` AS ProdReference,
ProdLang.`name` AS ProductName,
ProdLang.`description` AS ProdDesc,
ROUND((TProduct.`price`*1.23)/4.1989,2) AS ProductPrice,

CASE 
    WHEN COUNT(ProdAttr.`id_product`) = 0 THEN 1 
    ELSE (GROUP_CONCAT(DISTINCT (CONCAT_WS (': ', GroupAttrLang.`name`, AttrLang.`name`)) ORDER BY AttrLang.`name` ASC)) 
END AS ProdAttributes,

/*IF ((COUNT(ProdAttr.`id_product`) > 0), GROUP_CONCAT(DISTINCT (CONCAT_WS (': ', GroupAttrLang.`name`, AttrLang.`name`)) ORDER BY AttrLang.`name` ASC) , 'n/a' ) AS ProdAttributes,*/

GROUP_CONCAT(DISTINCT (CONCAT_WS (' - ', ParLang.`name`, CatLang.`name` ))) AS ProdFit 
    FROM `ps_product` AS TProduct
        LEFT JOIN `ps_category_product` AS CatProd ON CatProd.`id_product` = TProduct.`id_product`

        LEFT JOIN `ps_category` AS Cat ON Cat.`id_category` = CatProd.`id_category`
        LEFT JOIN `ps_category_lang` AS ParLang ON Cat.`id_parent` = ParLang.`id_category`
        LEFT JOIN `ps_product_lang` AS ProdLang ON ProdLang.`id_product` = TProduct.`id_product`
        LEFT JOIN `ps_category_lang` AS CatLang ON CatLang.`id_category` = CatProd.`id_category`
        LEFT JOIN `ps_product_attribute` AS ProdAttr ON ProdAttr.`id_product` = TProduct.`id_product`
        LEFT JOIN `ps_product_attribute_combination` AS ProdAttrComb ON ProdAttrComb.`id_product_attribute` = ProdAttr.`id_product_attribute`
        LEFT JOIN `ps_attribute` AS TAttr ON TAttr.`id_attribute` = ProdAttrComb.`id_attribute`
        LEFT JOIN `ps_attribute_group_lang` AS GroupAttrLang ON GroupAttrLang.`id_attribute_group` = TAttr.`id_attribute_group`
        LEFT JOIN `ps_attribute_lang` AS AttrLang ON AttrLang.`id_attribute` = TAttr.`id_attribute`
    WHERE 
        Cat.`id_parent` != 1 AND 
        ProdLang.`id_lang`=1 AND
        CatLang.`id_lang` = 1 AND
        GroupAttrLang.`id_lang` = 1 AND
        AttrLang.`id_lang` = 1
             GROUP BY TProduct.`reference` ORDER BY TProduct.`reference` ASC;

Everything working except handle a NULL values from a listing above. I tried IF statement result was the same, query skip rows with NULL values. I try make a single query with only one thing to print:

SELECT 
CASE 
    WHEN COUNT(ProdAttr.`id_product`) > 0 THEN COUNT(ProdAttr.`id_product`)
    ELSE 'n/a'
END AS ProdAttrList
FROM `ps_product` AS TProduct 
    LEFT JOIN `ps_product_attribute` AS ProdAttr ON ProdAttr.`id_product`=TProduct.`id_product` 
        GROUP BY TProduct.`reference`;

And that working perfect, see image PrtSc. of last listing


Solution

  • Must change WHERE statement:

    ...WHERE
    GroupAttrLang.`id_lang` = 1 AND
    AttrLang.`id_lang` = 1...
    

    To this:

    LEFT JOIN `ps_attribute_group_lang` AS GroupAttrLang ON GroupAttrLang.`id_attribute_group` = TAttr.`id_attribute_group` AND GroupAttrLang.`id_lang` = 1
    LEFT JOIN `ps_attribute_lang` AS AttrLang ON AttrLang.`id_attribute` = TAttr.`id_attribute` AND AttrLang.`id_lang` = 1 
    

    Problem SOLVED, you can now export catalog of products from your prestashop.