我有一个MySQL查询,我试图链接一个" NOT IN"在它的最后。
以下是使用Active Record在ruby中的样子:
not_in = find_by_sql("SELECT parent_dimension_id FROM relations WHERE relation_type_id = 6;").map(&:parent_dimension_id)
joins('INNER JOIN dimensions ON child_dimension_id = dimensions.id')
.where(relation_type_id: model_relation_id,
parent_dimension_id: sub_type_ids,
child_dimension_id: model_type)
.where.not(parent_dimension_id: not_in)
所以我试图做的SQL查询看起来像这样:
INNER JOIN dimensions ON child_dimension_id = dimensions.id
WHERE relations.relation_type_id = 5
AND relations.parent_dimension_id
NOT IN(SELECT parent_dimension_id FROM relations WHERE relation_type_id = 6);
有人可以向我确认我应该使用该查询吗? 我链接在哪里?不是吗?
答案 0 :(得分:3)
如果你真的想要
SELECT parent_dimension_id
FROM relations
WHERE relation_type_id = 6
作为子查询,您只需要将该SQL转换为ActiveRecord关系:
Relation.select(:parent_dimension_id).where(:relation_type_id => 6)
然后将其用作where
调用中的值,方法与使用数组的方式相同:
not_parents = Relation.select(:parent_dimension_id).where(:relation_type_id => 6)
Relation.joins('...')
.where(relation_type_id: model_relation_id, ...)
.where.not(parent_dimension_id: not_parents)
当您使用ActiveRecord关系作为where
中的值并且该关系选择单个列时:
r = M1.select(:one_column).where(...)
M2.where(:column => r)
ActiveRecord非常智能,可以将r
的SQL内联为in (select one_column ...)
,而不是进行两次查询。
你可以替换你的:
joins('INNER JOIN dimensions ON child_dimension_id = dimensions.id')
如果您的关系也已设置,则使用更简单的joins(:some_relation)
。
答案 1 :(得分:0)
您可以使用值或值数组提供where子句,在这种情况下,它们将被转换为in (?)
子句。
因此,查询的最后一部分可能包含映射:
.where.not(parent_dimension_id:Relation.where(relation_type_id:6).map(&:parent_dimension_id))
或者你可以准备一份声明
.where('parent_dimension_id not in (?)', Relation.where(relation_type_id:6).map(&:parent_dimension_id) )
基本上完全相同