是的,另外一个这样的问题。这是EAV带来的额外痛苦。对不起。
在您询问之前:
否,不能选择Solr / Elastic Search。
否,过滤器组和过滤器不可定义。
否,现有答案似乎不适用。我已经待了好几天了。
问题陈述:
如何编写查询:
我想我需要说:
应用过滤器后,获取所有过滤器组和过滤器。得到 每个过滤器计数当前有多少个产品 应用了过滤器和此过滤器。
我能得到的最接近的是:
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
的过滤器后,仍然适用的过滤器的计数。
这与我想要的相反,但我可以使用它。但是我无法弄清楚如何使用超过1个过滤器。
FilterGroup表:
过滤器表:
Products_Filters表:
按产品编号是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
应该会导致过滤器计数更改为:
选择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
结果:
如果我缺少任何信息,请告诉我。我是个菜鸟。
我和: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
结果:
如果不清楚,则应用的滤镜为银色(20)和黑色(5)。结果是可以使用过滤器找到的过滤器和产品计数。
该子查询已被注释掉,因为我实际上不会在其中运行-我已经有了ID。
如果可以对其进行修改以返回具有0的过滤器,那么我将完成。