MySQL分面搜索/导航分面计数

MySQL分面搜索/导航分面计数,mysql,rdbms,facet,faceted-search,Mysql,Rdbms,Facet,Faceted Search,是的,还有一个这样的问题。。这是一个额外的痛苦EAV的东西。对不起 在提问之前: 不,Solr/Elastic搜索不是一个选项 否,无法定义筛选器组和筛选器 不,现有的答案似乎不适用。我已经做了好几天了 问题陈述: 如何编写符合以下条件的查询: 保留所有筛选器,即使是产品计数为0的筛选器 更改每个过滤器的计数以显示当前过滤器集的产品数量 换句话说,我认为我需要: 应用过滤器时,获取所有过滤器组和过滤器。得到 每个过滤器的计数,显示当前有多少产品可用 应用过滤器和这个 我能得到的最接近的结

是的,还有一个这样的问题。。这是一个额外的痛苦EAV的东西。对不起

在提问之前:

  • 不,Solr/Elastic搜索不是一个选项

  • 否,无法定义筛选器组和筛选器

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

问题陈述:
如何编写符合以下条件的查询:

  • 保留所有筛选器,即使是产品计数为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
结果:

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

这与我想要的正好相反,但我可以用它。但是,我不知道如何在应用了一个以上的过滤器的情况下使其工作

各表: 过滤器组表:

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

筛选表:

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

产品\u过滤器表:

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

数据呈现方式不同: 按产品括号中的数字是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
Silver
将导致过滤器计数更改为:

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

可能有用的额外信息 用于获取产品和筛选器的查询 获取产品:

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 
    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
结果:

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

子查询被注释掉了,因为我实际上不会在那里运行它——我已经有了ID


如果可以修改它以同时返回包含0的筛选器,我会这样做。

您提供了很多信息,但我在这里看不到明确的问题陈述。您的查询应该做什么?你能给我们看一些样本数据吗?嗨@TimBiegeleisen,可能信息太多了。。。编辑,希望使问题更清楚,并显示更多的数据。