4

我正在尝试根据产品类别页面的方面选择产品。

基本结构是:

产品_Facets
--------------------------------
UID ProductID FacetID FacetOptionID
 1 1 1 1
 2 1 1 2
 3 1 2 4
 4 1 2 7
产品
--------------------------------
产品ID 产品名称
    1 一些小部件

我想为所有用户选择的方面选择所有方面记录设置为正确值的产品。

因此,如果我有以下请求:
Facet ID 1 设置为值 6 AND
Facet ID 2 设置为值 97 AND
Facet ID 5 设置为值 43 AND

我希望查询从产品表中获取所有产品,这些产品在任何给定产品的构面表中都有所有这些构面记录。查询不应返回仅满足某些要求的产品。

我想我需要在有子句中做一个子查询,但我不确定它是如何结构化的?

4

2 回答 2

3

一种方法是使用 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

任何一种方法都只会从 Products 中返回记录,其中 Product_Facets 记录存在于每个请求的 FacetID 和 FacetOptionID (我假设这是您提到的 Value 字段。)

于 2011-06-07T15:05:13.947 回答
0

我只会从构面表中预查询那些匹配并应用 HAVING 计数与您选择的标准完全相同的实体,然后将其加入到产品表中。

第一个“PreQuery”对每个组合应用“OR”作为单独测试每一行......但 HAVING 子句确保所有 3 个条件都正确合格。

SELECT STRAIGHT_JOIN
      P.*
   FROM
      ( select pf.ProductID,
               count(*) as MatchedCriteria
           from
              Product_Facets pf
           where
                 (pf.FacetID = 1 AND FacetOptionID = 6 )
              OR (pf.FacetID = 2 AND FacetOptionID = 97 )
              OR (pf.FacetID = 5 AND FacetOptionID = 43 )
           group by
              pf.ProductID
           having
              count(*) = 3 ) PreQuery

      Join Products p
         on PreQuery.ProductID = p.ProductID
   order by
      p.ProductName
于 2011-06-07T15:38:28.080 回答