Используя следующий запрос, я собираюсь отфильтровать результаты по выбранному tags
или categories
:
DECLARE @categories NVARCHAR(MAX),
@tags NVARCHAR(MAX);
SELECT @categories = '1,2,4', -- comma separated category ids
@tags = '2,3' -- comma separated tag ids
SELECT p.id,
p.title,
p.price
FROM tbl_products p
LEFT JOIN tbl_product_categories pc ON @categories IS NOT NULL AND pc.product_FK = p.id
LEFT JOIN tbl_product_tags pt ON @tags IS NOT NULL AND pt.product_FK = p.id
WHERE ( p.price >= @min_price OR @min_price IS NULL )
AND ( p.price <= @max_price OR @max_price IS NULL )
AND ( pc.category_FK IN (SELECT value FROM STRING_SPLIT(@categories, ',')) OR @categories IS NULL )
AND ( pt.tag_FK IN (SELECT value FROM STRING_SPLIT(@tags, ',')) OR @tags IS NULL)
GROUP BY p.id
HAVING COUNT(p.id) = ( (SELECT COUNT(*) FROM STRING_SPLIT(@categories, ',')) + (SELECT COUNT(*) FROM STRING_SPLIT(@tags, ',')) )
Но это не дает ожидаемых результатов! Я подозреваю, что часть HAVING не используется правильно, поскольку она не производит правильный подсчет каждый раз на основе переданных тегов и идентификаторов категорий.
Кто-нибудь знает, как мы могли бы реализовать такие ситуации, применить реляционное разделение для извлечения продуктов, у которых все эти переданы @categories
и @tags
вместе ??? Есть способ лучше?
- обновление: например, используйте следующую дату образца:
tbl_products:
id title price
===================
1 mouse 10
2 keyboard 18
3 iphone 8 100
4 note 8 90
tbl_product_categories:
product_FK category_FK
======================
1 1
2 1
3 2
4 2
tbl_product_tags:
product_FK tag_FK
=================
1 1
3 1
3 2
4 2
поэтому, если мы передадим @categories = '2'
, @tags = '1,2'
и min_price = 50
, мы должны получить iphone 8