Sql 对多个父记录的子记录的属性进行求和操作
我在我的产品模型中有这样一种方法,可以满足我的需要:Sql 对多个父记录的子记录的属性进行求和操作,sql,ruby-on-rails,ruby,activerecord,Sql,Ruby On Rails,Ruby,Activerecord,我在我的产品模型中有这样一种方法,可以满足我的需要: def self.available available = [] Product.all.each do |product| if product.quantity > product.sales.sum(:quantity) available << product end end return available end def self.available 可用=[] P
def self.available
available = []
Product.all.each do |product|
if product.quantity > product.sales.sum(:quantity)
available << product
end
end
return available
end
def self.available
可用=[]
Product.all.each do|产品|
如果product.quantity>product.sales.sum(:数量)
可用这将创建一系列查询,其数量等于由于sum
查询而产生的产品数量。我想到了一种减少数据库查询的方法
map = Sale.joins(:product)
.group("products.id", "products.quantity").sum(:quantity).to_a
这将产生一个类似于
[[[1,20],30], [[2,45], 20]]
这对应于[[product\u id,product\u quantity],salled\u quantity]]
现在循环这个数组并比较值
available = []
map.each do |item|
if item[0][1] > item[1]
available << item[0][0]
end
end
现在,您在两个查询中得到了相同的输出,而不是Product.count(N)
查询数。此解决方案有时效率低下,但如果我有任何想法,我会定期更新它。您可以尝试:
Product.where("products.quantity > Coalesce((select sum(s.quantity) from sales s where s.product_id = products.id), 0)")
Product.where("products.quantity > Coalesce((select sum(s.quantity) from sales s where s.product_id = products.id), 0)")