MySQL的搜索/导航构面计数

时间:2018-08-13 05:43:49

标签: mysql rdbms facet faceted-search

是的,另外一个这样的问题。这是EAV带来的额外痛苦。对不起。

在您询问之前:

  • 否,不能选择Solr / Elastic Search。

  • 否,过滤器组和过滤器不可定义。

  • 否,现有答案似乎不适用。我已经待了好几天了。

问题陈述:
如何编写查询:

  • 保留所有过滤器,即使产品计数为0的过滤器
  • 更改每个过滤器的计数以显示当前过滤器集有多少种产品。

我想我需要说:

  

应用过滤器后,获取所有过滤器组和过滤器。得到   每个过滤器计数当前有多少个产品   应用了过滤器和此过滤器。

我能得到的最接近的是:

SELECT 
    fg.Title, 
    f.Title, 
    COUNT(DISTINCT(pf1.ProductsID))
FROM 
    Products_Filters pf1
JOIN 
    Products_Filters pf2 ON pf1.ProductsID = pf2.ProductsID
JOIN 
    Filter f on f.ID = pf2.FilterID
JOIN 
    FilterGroup fg on fg.ID = pf2.FilterGroupID
WHER 
    pf1.FilterID = 1
GROUP BY 
    fg.Title, f.Title

结果:

enter image description here

这显示了应用了Lexus的过滤器后,仍然适用的过滤器的计数。

这与我想要的相反,但我可以使用它。但是我无法弄清楚如何使用超过1个过滤器。

表格:

FilterGroup表:

enter image description here

过滤器表:

enter image description here

Products_Filters表:

enter image description here

数据呈现方式不同:

括号中的

按产品编号是Filter.ID

P.ID = 1
汽车:雷克萨斯(1),丰田(3)
颜色:银(20)
车轮:HS203(19)

P.ID = 2
汽车:雷克萨斯(1)
颜色:绿色(6)
车轮:VSXX(17),HS203(19)

P.ID = 3
汽车:法拉利(2)
颜色:绿色(6)
车轮:M1R(18)

P.ID = 4
汽车:法拉利(2)
颜色:黑色(5)
车轮:

P.ID = 5
汽车:日产(14)
颜色:银(20)
车轮:XD9(16)

P.ID = 6
汽车:日产(14)
颜色:白色(4),黑色(5)
车轮:VSXX(17)

通过过滤器
雷克萨斯:P1,P2
法拉利:P3,P4
丰田:P1
日产:P6

黑色:P4,P6
绿色:P3
银牌:P1,P2,P5
白色:P6

HS203:P1
M1R:P3
VSXX:P2,P6
XD9:P5

示例结果

选择Lexus应该会导致过滤器计数更改为:

enter image description here

选择LexusSilver会导致过滤器计数更改为:

enter image description here

选择Silver将导致过滤器计数更改为:

enter image description here

可能有用的其他信息

获取产品和过滤器的查询

获取产品:

SELECT 
    Products.* 
FROM 
    Products 
INNER JOIN 
    Products_Filters ON Products_Filters.ProductsID = Products.ID 
WHERE 
    (Products.ProductListPagesID = 6) 
    AND 
    (
        ((Products_Filters.FilterID IN (1))) 
        OR 
        ((Products_Filters.FilterID IN (19)))
    ) 
GROUP BY 
    Products.ID 
HAVING 
    (COUNT(Products.ID) = 2) 
ORDER BY 
    Products.Title ASC

那很好。注意:这是内置在ORM中的。

初始过滤器(未应用过滤器):

SELECT 
    FilterGroup.Title AS FilterGroupTitle, 
    Filter.Title AS FilterTitle, 
    COUNT(Products_Filters.ProductsID) AS Count
FROM 
    ProductListPage_FilterGroups 
LEFT JOIN 
    FilterGroup ON FilterGroup.ID = ProductListPage_FilterGroups.FilterGroupID
LEFT JOIN 
    Filter ON Filter.FilterGroupsID = FilterGroup.ID
LEFT JOIN 
    Products_Filters ON Products_Filters.FilterID = Filter.ID
WHERE 
    (ProductListPage_FilterGroups.ProductListPageID = 6)
GROUP BY 
    Filter.ID,  
    FilterGroup.Title, 
    Filter.Title, 
ORDER BY 
    FilterGroup.Title, 
    Filter.Title

结果:

enter image description here

如果我缺少任何信息,请告诉我。我是个菜鸟。

更新。

我和:p有一点距离

SELECT 
    Filter.ID, 
    Filter.Title AS FilterTitle, 
    FilterGroup.Title AS FilterGroupTitle, 
    COUNT(Products_Filters.ProductsID) AS Count
FROM 
    ProductListPage_FilterGroups 
LEFT JOIN 
    FilterGroup ON FilterGroup.ID = ProductListPage_FilterGroups.FilterGroupID
LEFT JOIN 
    Filter ON Filter.FilterGroupsID = FilterGroup.ID
LEFT JOIN 
    Products_Filters ON Products_Filters.FilterID = Filter.ID
WHERE 
    ProductListPage_FilterGroups.ProductListPageID = 6
   AND 
   Products_Filters.ProductsID IN 
   (
        1,3,5,6
        /*SELECT 
           p.ID
        FROM 
            Products p
        INNER JOIN 
            Products_Filters pf ON pf.ProductsID = p.ID
        WHERE 
            p.ProductListPagesID = 6
        AND 
        (
            pf.FilterID IN (20, 5)
        )
        GROUP BY p.ID 
        HAVING COUNT(p.ID) >= 1*/
    )
GROUP BY Filter.ID

结果:

enter image description here

如果不清楚,则应用的滤镜为银色(20)和黑色(5)。结果是可以使用过滤器找到的过滤器和产品计数。

该子查询已被注释掉,因为我实际上不会在其中运行-我已经有了ID。

如果可以对其进行修改以返回具有0的过滤器,那么我将完成。

0 个答案:

没有答案