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

hkmswyz6  于 2021-06-23  发布在  Mysql
关注(0)|答案(0)|浏览(346)

是的,还有一个这样的问题。。这是一种额外的痛苦。我很抱歉。
在你问之前:
不,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 应用。
这和我想要的正好相反,但我可以用它。我不知道如何使一个以上的过滤器工作,然而。

表格:

filtergroup表:

筛选表:

产品过滤器表:

数据呈现方式不同:

括号中的按产品编号是filter.id
p、 id=1
汽车:雷克萨斯(1)、丰田(3)
颜色:银色(20)
车轮:hs203(19)
p、 内径=2
汽车:雷克萨斯(1)
颜色:绿色(6)
车轮:vsxx(17)、hs203(19)
p、 内径=3
汽车:法拉利(2)
颜色:绿色(6)
车轮:m1r(18)
p、 内径=4
汽车:法拉利(2)
颜色:黑色(5)
车轮:
p、 内径=5
汽车:日产(14)
颜色:银色(20)
车轮:xd9(16)
p、 内径=6
汽车:日产(14)
颜色:白色(4),黑色(5)
车轮:vsxx(17)
按过滤器
雷克萨斯:p1、p2
法拉利:p3、p4
丰田:p1
日产:p6
黑色:p4、p6
绿色:p3
银色:p1、p2、p5
白色:p6
高速203:p1
m1r:p3
vsxx:p2、p6
xd9:第5页

示例结果

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

选择 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 
    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

结果:

如果有任何信息我丢失请让我知道。我不善提问。

更新。

我更接近于:

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的过滤器,我就可以这样做了。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题