查找没有子项且具有某些参数某些参数的父记录

时间:2019-09-25 18:59:20

标签: sql ruby-on-rails postgresql activerecord

所以我知道如何查找所有没有子记录的父记录。

Parent.joins(:child).where(child: {id: nil})

但是,如何查找最近30天内没有创建子级的所有父级记录。我尝试了以下操作,但没有成功

Parent.joins(:child).where(child: {id: nil, created_at: 30.days.ago...Time.current})
Parent.joins(:child).where(child: {created_at: 30.days.ago...Time.current).where(child: {id: nil})

他们俩都没有工作。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您应该可以使用where.not

更新:即使没有孩子也要获取所有记录,请使用left_outer_joins

# from: 
# Parent.joins(:child).where.not(child: { created_at: 30.days.ago...Time.current } )
# to:
Parent.left_outer_joins(:child).where.not(child: { created_at: 30.days.ago...Time.current } )

这很容易解释,绘制了所有不符合标准的记录。

为解释joinsleft_outer_joins之间的区别,我将使用another question中的引号,因为它们的解释是完美的:

  

INNER JOIN:两个表中都匹配时返回行。

     

左联接:即使右表中没有匹配项,也返回左表中的所有行。

因此,您想要后者以便包括没有孩子的父记录。

希望有帮助-让我知道您的生活状况或有任何疑问:)

答案 1 :(得分:2)

您将需要内部查询来执行所需的操作。一种方法:

Parent.where.not(id: Parent.joins(:child).where(child: { created_at: 30.days.ago...Time.current }).pluck(:id).uniq)

这将选择30天内没有孩子的所有父母。希望有帮助。

编辑:

它可以分为两个简单的查询:

unwanted_parents_ids = Parent.joins(:child).where(child: { created_at: 30.days.ago...Time.current }).pluck(:id).uniq
wanted_parents = Parent.where.not(id: unwanted_parents_ids)