gpt4 book ai didi

sql - 使用 Arel 生成子查询以获得平均值的平均值

转载 作者:行者123 更新时间:2023-12-04 06:32:58 26 4
gpt4 key购买 nike

假设我有几张 table

orders = Arel::Table.new :orders
stores = Arel::Table.new :stores
managers = Arel::Table.new :managers

一个经理有很多商店,一个商店有很多订单。

有一天,我想查询经理工作的订单的平均总数。哦,我想按商店分组。所以要明确一点,我想获得经理的平均订单总数,对于他们工作的每家商店。

让我们假设我们已经查找了我们的经理:
manager = Manager.find(some_id)


totals = orders.where(orders[:store_id].in(manager.store_ids)).group(orders.store_id).project(orders[:total].average)

puts totals.to_sql

"SELECT AVG(`orders`.`total`) AS avg_id FROM `orders` WHERE `orders`.`store_id` IN (1, 2, 3) GROUP BY `orders`.`store_id`"

是的,这很好用。但是我怎样才能查询这些平均值的平均值呢?

获取此查询的 Arel 是什么?
"SELECT AVG(avg_id) FROM (SELECT AVG(`orders`.`total`) AS avg_id FROM `orders` WHERE `orders`.`store_id` IN (1, 2, 3) GROUP BY `orders`.`store_id`) as avg_id_alias;"

有人知道吗?

最佳答案

您可以非常接近,但 ActiveRecord 不支持直接执行 Arel 结构,您必须先将它们转换为 SQL。

这是一个类似于您正在做的事情的示例:

o = Orders.arel_table
o_avg = Orders.select(:avg[:store_id].as('avg_id')).
where(:store_id => [1,2,3]).group(:store_id)

Orders.find_by_sql("select avg(avg_id) from (#{o_avg.to_sql})")

对这种妥协感到满意。 ActiveRecord 不太适合一次收集关于多个模型的聚合数据,如果您明智地将 SQL 修补在一起,那么 Arel 可以作为一个合适的工具来服务它。

关于sql - 使用 Arel 生成子查询以获得平均值的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5165002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com