Rails子查询加入

时间:2015-07-03 06:25:57

标签: mysql ruby-on-rails join activerecord subquery

我有一个需要在数据库中获取某些过滤器的应用程序。过滤器是一组ABC,即:

A = 1 and B = 2 and C = 3

每个过滤器都有一个值,一个特征和一个类别(由ABC表示),即:

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

这是一个表达我搜索内容的图表:

query diagram

当我使用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),但我只保留了两个子查询中的产品。

但是我认为这个解决方案可行,我无法使用Active记录构建此类查询。两个主要问题是:

  • 我事先并不知道过滤器的数量
  • 我没有找到一个正确的方法来加入像这样的案例
  • 的子查询

您有任何想法/链接推荐吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

我发现,使用MySQL数据库,我可以简单地执行“OR”条件,然后仅过滤重复条目,如下所示:

SELECT * FROM products WHERE 
    (category = 'dimension' AND characteristic = 'width' AND value = 10 ) 
 OR (category = 'color' AND characteristic = 'background' AND value = 'red') 
 GROUP BY id 
 HAVING count(*) > 0