我有一个称为“对象”的模型(这并不重要)
它具有默认价格(列称为“价格”)。
然后是一个Schedule对象,该对象可以覆盖特定日期的价格。
我希望能够在SQL查询期间确定MINIMUM价格(根据定义,它是默认价格和“当前”价格之间的MINIMUM),以便能够按计算出的最低价格进行订购
我想让我的搜索查询尽可能高效,我想知道是否可以做这样的事情:
Object.select("id AS p_id, id, (SELECT MIN(`schedules`.`price`) FROM `schedules` WHERE `schedules`.`object_id` = p_id`) AS objects.min_price").limit(5)
但是,它会生成一个奇怪的SQL,如下所示:
SELECT `objects`.`id` AS t0_r0, `objects`.`title` AS t0_r1, `objects`.`created_at` AS t0_r2, `objects`.`updated_at` AS t0_r3, `objects`.`preferences` AS t0_r4 ........ (a lot of columns here) ... ` WHERE `objects`.`id` IN (1, 2, 3, 4 ....)
因此,如您所见,它不起作用。首先-它加载了对象表中的所有列,其次-它看起来很可怕。
我不想使用finder_sql的原因是我有很多可选参数和东西,因此在获取结果本身之前,强烈建议使用AR :: Relation对象。
除了上面提到的以外,我在数据库中还有很多记录,我认为将它们全部加载到内存中并不是一个好主意,这就是我想要执行此子查询的主要原因- 只是为了过滤掉尽可能多的记录。
有人可以帮助我如何更有效地做到这一点吗?
如果分别生成子查询并使用联接而不是相关的子查询,则可以使此操作更容易:
subquery = Schedule.select('MIN(price) as min_price, object_id') .group(:object_id) .to_sql Object.joins("JOIN (#{subquery}) schedules ON objects.p_id = schedules.object_id") .select('objects.*, schedules.min_price') .limit(5)