@Barancheek

Фильтрация характеристик товаров с подсчетом?

Слева запрос считает все имеющиеся фасеты (опции) товаров. Справа считает доступные фасеты согласно условиям фильтрации. Как переписать запрос справа, чтобы не вошедшие опции остались в выборке с нулями ?

673d86295c493231516788.jpeg

Запрос и подсчет всех фасетов
--get facets 
select	
	pp.attr_alias,
	pp.option_value,
	pp.option_alias,
    count(pp.option_value)
from "Products" p
JOIN "Product_properties" pp ON pp.prod_id = p.id
WHERE p.cat_id = 1
GROUP BY pp.attr_alias, pp.option_value, pp.option_alias


Запрос и подсчет отфильтрованных фасетов
--get filtered facets 
select
	pp.attr_alias,
	pp.option_value,
	pp.option_alias,
    count(pp.option_value)      
from "Products" p
JOIN "Product_properties" pp ON  pp.prod_id = p.id
WHERE 
p.cat_id = 1
AND
p.id = ANY (
	SELECT prod_id
	FROM "Product_properties" pp
	WHERE pp.attr_alias = 'ram' AND pp.option_alias IN ('2gb','3gb','4gb','8gb')
)
AND
p.id = ANY (
    SELECT prod_id
    FROM "Product_properties" pp
    WHERE pp.attr_alias = 'storage' AND pp.option_alias IN ('16gb','128gb')
)    
GROUP BY pp.attr_alias, pp.option_value, pp.option_alias
  • Вопрос задан
  • 40 просмотров
Решения вопроса 1
@alexalexes
Из where убрать дополнительное условие фильтрации, и добавить его же в case в count.
Тогда count будет отбивать именно статистику по условиям фильтрации (считается все, что выходит из case не null), но занулять там, где условия не выполняются.
...
count(
case
when p.id = ANY (
	SELECT prod_id
	FROM "Product_properties" pp
	WHERE pp.attr_alias = 'ram' AND pp.option_alias IN ('2gb','3gb','4gb','8gb')
)
AND
p.id = ANY (
    SELECT prod_id
    FROM "Product_properties" pp
    WHERE pp.attr_alias = 'storage' AND pp.option_alias IN ('16gb','128gb')
)    
then 1
end
)
...

PS: Подзапросы Any можно вынести в секцию With, если они дают однотипную выборку и используются во многих местах.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы