MySql过滤查询

标签 mysql one-to-many

我正在尝试创建产品过滤器功能,但在尝试根据用户选择的内容组合正确的查询时遇到问题。假设表格是:

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;

每个 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/

相关文章:

Phpacademy OOP 登录和注册第 8/23 部分函数 error() 在非对象行 56 上

java - Hibernate从父级更新子级,生成的sql查询条件中未指定连接列

hibernate - "org.hibernate.type.CollectionType : Created collection wrapper"是什么意思?

java - JPA注解@OneToMany关系不同记录

php - 搜索具有 2 个节点的父节点

mysql - 如何在 Coldfusion/MySQL 中跟踪产品搜索引擎中的通用点击?

java - JPA 存储库 - 一对多 - 删除一个子项时出现问题

c# - 一对多关系的 lambda 表达式

mysql - 子查询和使用相关子查询引用外部的可能性

php - 如何按列而不是按字母顺序排列查询