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