是的,还有一个这样的问题。。这是一种额外的痛苦。我很抱歉。
在你问之前:
不,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的过滤器,我就可以这样做了。
暂无答案!
目前还没有任何答案,快来回答吧!