【问题标题】:Rails Subquery joinRails 子查询连接
【发布时间】:2015-07-03 06:25:57
【问题描述】:

我有一个应用程序需要在数据库中获取一些过滤器。过滤器是一组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

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

当我尝试使用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


【解决方案1】:

我发现,使用 MySQL 数据库,我可以简单地做一个“或”条件,然后只过滤重复条目,如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2013-09-14
    相关资源
    最近更新 更多