2014-11-24 107 views
0

我正在尝试创建产品过滤器功能,并且在尝试根据用户选择的内容一起获取正确的查询时遇到了问题。让说的表是:MySql过滤器查询

product_tb 
+-----------+ 
|product_sku| 
+-----------+ 
|ABC  | 
|XYZ  | 
|-----------| 

product_attribute_tb 

+-----------+--------------+---------------+ 
|product_sku|attribute_name|attribute_value| 
+-----------+--------------+---------------| 
|ABC  |colour  |red   | 
|ABC  |size   |M    | 
|XYZ  |colour  |red   | 
|XYZ  |size   |L    | 
|-----------|--------------|---------------| 

我正在寻找的是,如果存在的所有属性的产品才会返回,所以如果用户选择“红”和“M”,它只会返回ABC。

我没有把这些属性放在产品表上的原因是因为它的SaaS应用程序和过滤器会因不同的应用程序而有所不同。

我不能使用硬编码名称进行多个连接,并且根据产品的名称和内容值,我可能会根据产品的名称和内容值灵活调整产品的40个潜在筛选器,因为这些可能会发生变化。

也许我错过了一些明显的东西,但如果有人可以帮助它,将不胜感激。

谢谢, 马丁。

+0

请重新格式化你的表格,不清楚你在问什么 – 2014-11-24 10:34:50

+0

我想问一个问题,我如何获得所有产品都有红色和L尺寸的颜色?这有意义吗? – Martin 2014-11-24 10:41:27

回答

1
SELECT 
pat.product_sku 
FROM 
product_attribute_tb pat 
INNER JOIN product_tb pt ON pat.product_sku = pt.product_sku 
GROUP BY pat.product_sku 
HAVING SUM((attribute_name = 'colour' AND attribute_value = 'red') OR (attribute_name = 'size' AND attribute_value = 'L')) >= 2; 

带电作业每个布尔表达式像(attribute_name = 'colour' AND attribute_value = 'red')(attribute_name = 'size' AND attribute_value = 'L')返回TRUE或FALSE,1或0。然后我们总结这些每一行,并检查true值大于2.欢迎加入您的product_tb表。

+0

你好,谢谢你......只是在加入.. – Martin 2014-11-24 10:59:57

+0

没有比这更容易。添加到我的答案。 – fancyPants 2014-11-24 11:02:35

+0

看起来不错。似乎有点慢,但我可以在这方面工作,因为查询已经非常复杂了。 真的很感谢帮助。 谢谢, 马丁 – Martin 2014-11-24 11:10:31