Wymuszenie wyświetlenia wiersza pomimo CONCAT_WS NULL

0

Witam,

Mam mały problem z moim zapytaniem, otóż chodzi o to, żeby zapytanie jeżeli natrafi na NULL'a, dokładniej to miejsce:

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

nie pomijało wiersza kiedy żaden atrybut nie jest przypisany do produktu tylko w komórce wyświetliło napis np "N/A".

Całe zapytanie wygląda następująco:

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; 

Może to już zmęczenie, a może jakiś mały błąd (albo ogromny), ale wyświetlają mi się tylko wiersze w których jest jakiś atrybut przypisany to produktu. Z IF'em też próbowałem (może też źle) ale efekt jest identyczny jak do powyższego CASE'a.

Samo zapytanie tylko z atrybutami -

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` 
  • wyświetla wyniki prawidłowo (załącznik).

PS. Może pomoże - chcę wyciągnąć dane z bazy danych sklepu opartego na prestashop.
Z góry dziękuję za jakąś pomoc.

0
 Coalesce(GROUP_CONCAT(DISTINCT (CONCAT_WS (' - ', ParLang.`name`, CatLang.`name`))), 'N/A') AS ProdFit
0

Dziękuję za odpowiedź, ale ta część zapytania działa prawidłowo:

GROUP_CONCAT(DISTINCT (CONCAT_WS (' - ', ParLang.`name`, CatLang.`name`        ))) AS ProdFit 

Natomiast z tą jest problem:

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

Tak jak napisałem wyżej, problem jest wtedy kiedy produkt nie ma atrybutu wtedy CONCAT_WS zwraca dwa razy NULL i 'przeskakuje' dalej - jeżeli chodzi o nazwy kategorii to wszystko jest w porządku, bo każdy produkt należy do jakiejkolwiek kategorii więc nie ma problemu z jego wyświetleniem.

Nie wiem jak mam przechwycić w tym dużym zapytaniu by jeżeli natrafi na null'a nie przeskakiwał tylko zwrócił jakąś wartość.

0

Znalazłem rozwiązanie, otóż problemem było

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

Trzeba warunki 'podpiąć' pod LEFT JOIN'a:

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` AND GroupAttrLang.`id_lang` = 1
LEFT JOIN `ps_attribute_lang` AS AttrLang ON AttrLang.`id_attribute` = TAttr.`id_attribute` AND AttrLang.`id_lang` = 1 

Teraz wszystko działa jak należy, poniżej cały kod dla potomnych którzy będą chcieli wyeksportować sobie katalog produktów z prestashop:

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 (GROUP_CONCAT(DISTINCT (CONCAT_WS (': ', GroupAttrLang.`name`, AttrLang.`name`)) ORDER BY AttrLang.`name` ASC)) 
		ELSE 'n/a' 
	END 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` AND GroupAttrLang.`id_lang` = 1
		LEFT JOIN `ps_attribute_lang` AS AttrLang ON AttrLang.`id_attribute` = TAttr.`id_attribute` AND AttrLang.`id_lang` = 1
		WHERE 
			Cat.`id_parent` != 1 AND 
			ProdLang.`id_lang`=1 AND
			CatLang.`id_lang` = 1
GROUP BY TProduct.`reference` ORDER BY TProduct.`reference` ASC; 

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1