【发布时间】:2015-07-03 06:25:57
【问题描述】:
我有一个应用程序需要在数据库中获取一些过滤器。过滤器是一组A、B 和C,即:
A = 1 and B = 2 and C = 3
每个过滤器都有一个值、一个特征和一个类别(由A、B 和C 表示),即:
category = 'dimension' and characteristic = 'width' and value = 10
category = 'color' and characteristic = 'background' and value = 'red'
为了这篇文章,数据有点过于复杂,但我们可以假设过滤器总是三重奏:
Filter :
category
characteristic
value
我需要从数据库中获取一定数量的过滤器。当过滤器应用于产品时,我拥有的过滤器越多,我必须找到的产品就越少。
我的第一个方法是做类似的事情:
(A = 1 and B = 2 and C = 3) or
(A = 4 and B = 5 and C = 6)
但是在前面的条件下,结果被扩展而不是限制(过滤器必须相互添加)。
一个新的尝试给了我:
(A = 1 and B = 2 and C = 3) and
(A = 4 and B = 5 and C = 6)
但这显然没有返回任何内容,因为查询尝试A = 1 and A = 4。
这是一个图表来表达我搜索的内容:
当我尝试使用or 进行查询时,我得到了所有(1) 和(2)。
select * from products where ( category = 'dimension' and characteristic = 'width' and value = 10 ) or ( category = 'color' and characteristic = 'background' and value = 'red' )
当我尝试使用and 进行查询时,我没有得到(1) 和(2)。
select * from products where ( category = 'dimension' and characteristic = 'width' and value = 10 ) and ( category = 'color' and characteristic = 'background' and value = 'red' )
所以一个解决方案是做一些查询,然后加入它们:
select where (A = 1 and B = 2 and C = 3) (1)
select where (A = 4 and B = 5 and C = 6) (2)
select (1) join (2)
这样我得到了所有的(1) 和(2),但我只保留了在两个子查询中找到的产品。
但是使用我认为可行的解决方案,我无法使用活动记录构建此类查询。两个主要问题是:
- 事先不知道过滤器的数量
- 对于这样的案例,我还没有找到合适的方法来连接子查询
你有什么想法/链接可以推荐吗?
谢谢,
【问题讨论】:
-
出了什么问题:
(A = 1 and B = 2 and C = 3) or (A = 4 and B = 5 and C = 6)?它似乎可以满足您的需求... -
我想要的是两个条件的交集:
all that match (1) and (2),我会添加一个图表来指定 -
我认为您让我感到困惑,因为 A 无法匹配 1 和 4...而您后来的声明并没有解释如何解决...它只是看起来像一个更复杂的方法写原始的“或”
-
然后我添加了一些信息和图表 :)
-
示例数据和实际 SQL 也可以。
标签: mysql ruby-on-rails join activerecord subquery