仍然对MySQL中的子查询和子查询感到困惑

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

基本结构是:

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字段.)

上一篇:MySQL在多对多中搜索


下一篇:OCP 1z0-071 79题(第一版)