【发布时间】:2016-06-04 10:54:16
【问题描述】:
我有一张名为products 的表。 (id, name, price),一个名为properties (id, name, type) 的表和一个名为product_properties (id, property_id, product_id,值)。
现在,我可以按如下方式过滤产品:
- 从 product_ids 列表开始。
- 对于我们要过滤的每个(属性、值):
- product_ids =
SELECT 'product_properties'.'product_id' FROM 'product_properties' WHERE 'product_properties'.'product_id' IN [list,of,product,ids] AND 'product_properties'.'property_id' = property_id AND 'product_properties'.'value' = 'some value here'
- product_ids =
- 重复第 2 步,直到我们过滤掉所有想要的属性。
- 最后,使用
SELECT * FROM 'products' WHERE 'products'.'id' IN [list,of,product,ids]选择所有匹配的产品
此方法需要对 N 个过滤器进行 N+1 个数据库查询。我希望可以将其组合到一个查询中。
我尝试了以下方法,但不起作用:
- INNER JOIN/OUTER JOIN -> 放弃指向除第一行之外的所有产品行的所有 product_properties,然后尝试对其强制执行所有 N 个 ID 和值。
- UNION -> 这将返回一个列表,其中包含与 一个或多个 过滤器匹配的产品,而不是 所有 个过滤器。
如何通过单个数据库查询(或尽可能少)来完成?
我正在使用 Ruby on Rails,这意味着我希望结果在 MySQL 和 SQLite 中都可以使用。
谢谢!
【问题讨论】:
标签: mysql sql join filtering union