我正在尝试创建产品过滤器功能,但在尝试根据用户选择的内容组合正确的查询时遇到问题。假设表格是:
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 个针对产品的潜在过滤器,我是否希望根据product_attribute_tb 的名称和内容值灵活地进行过滤,因为这些值可能会发生变化。
也许我遗漏了一些明显的东西,但如果有人可以提供帮助,我将不胜感激。
谢谢, 马丁。
最佳答案
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;
- 看到它在 sqlfiddle 中实时运行
每个 bool 表达式如 (attribute_name = 'colour' AND attribute_value = 'red')
和(attribute_name = 'size' AND attribute_value = 'L')
返回 true 或 false、1 或 0。然后我们对每行求和并检查 true
是否成立。值大于 2。欢迎加入您的 product_tb
表。
关于MySql过滤查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27102641/