我正在尝试根据产品类别页面的构面选择产品.
基本结构是:
Product_Facets -------------------------------- UID ProductID FacetID FacetOptionID 1 1 1 1 2 1 1 2 3 1 2 4 4 1 2 7
Products -------------------------------- ProductID ProductName 1 Some Widget
我想选择所有产品,这些产品的构面记录设置为所有用户选定构面的正确值.
所以,如果我有一个请求:
方面ID 1设置为值6 AND
方面ID 2设置为值97 AND
方面ID 5设置为值43 AND
我希望查询从product表中获取所有产品中包含所有facet记录的产品.查询不应返回仅满足某些要求的产品.
我想我需要在having子句中做一个子查询,但是我不确定它是如何构造的?
解决方法:
一种方法是使用EXISTS子句,您可以根据请求动态生成:
select p.*
from Products p
where
exists (select 1 from Product_Facets where ProductID = p.ProductID
and FacetID = 1
and FacetOptionID= 6)
and
exists (select 1 from Product_Facets where ProductID = p.ProductID
and FacetID = 2
and FacetOptionID= 97)
and
exists (select 1 from Product_Facets where ProductID = p.ProductID
and FacetID = 3
and FacetOptionID = 43)
另一种方法是直接内连接(也很容易动态生成):
select p.*
from Products p
join Product_Facets f1 on p.ProductID = f1.ProductID
and f1.FacetID = 1 and f1.FacetOptionID = 6
join Product_Facets f2 on p.ProductID = f2.ProductID
and f2.FacetID = 2 and f2.FacetOptionID = 97
join Product_Facets f3 on p.ProductID = f3.ProductID
and f3.FacetID = 3 and f3.FacetOptionID = 43
这两种方法都只返回Product中记录的记录,其中Product_Facets记录存在于每个请求的FacetID和FacetOptionID(我假设这是您提到的Value字段.)