当前位置: 首页 > 面试题库 >

Rails select子查询(如果可能,不使用finder_sql)

岳飞航
2023-03-14
问题内容

我有一个称为“对象”的模型(这并不重要)

它具有默认价格(列称为“价格”)。

然后是一个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)


 类似资料:
  • 我在sqlite查询结果的子查询中遇到问题。当执行下面的查询时,成功返回Sqlite数据库中的结果,但当运行程序时,它不返回任何值。我在下面的程序中做错了什么。请给我一些建议。 查询: java程序:

  • 问题内容: 当需要有序集的最后一行时,通常会创建派生表并重新排序。例如,要以自动递增的方式返回表的最后3个元素: 由于也可以具有偏移量,因此如果我们事先知道此查询的行数(例如10),则可以实现相同的结果: 是否可以对表运行子查询并使用该数字动态构建一个? 问题答案: 不,不可能指定动态偏移量。 带有子查询的原始查询是执行此操作的最简单方法。

  • 关于子查询使用 利用子查询进行过滤 列出够物品RGAN01的所有客户。 检索包含物品RGAN01的所有订单编号。 检索具有前一步骤列出的订单编号所有客户ID。 检索前一步骤返回的所有客户ID的客户信息。 mysql> SELECT order_num -> FROM OrderItems -> WHERE prod_id = 'RGAN01'; +-----------+ | or

  • 问题内容: 以下查询对我来说绝对正常: 但是,如果我使用而不是与子查询的结果进行比较,则不会得到任何结果。如何在上述查询中使用? 问题答案: 首先,这个查询 应该 不会是工作的罚款: 因为不正确的SQL。并且,您应该学习使用正确的语法。大概,您打算: 可以想象,您可以在子查询中添加代替和’%’的内容: 但我会这样写: 这与查询没有完全相同的作用。它做一些更合理的事情。它会确定子查询中是否有 任何

  • 问题内容: 我在尝试执行查询时遇到了一些问题。我有两个表,一个表包含元素信息,另一个表包含与第一个表的元素相关的记录。想法是在同一行中获取元素信息以及多个记录信息。 结构可以这样解释: 这是我想要实现的: 以下查询可获得正确的结果,但对我而言似乎效率极低,必须为每个列迭代table2。无论如何,可以进行子查询并重用它吗? 问题答案: 您可以将聚合取出到CTE(公用表表达式)中: 当然,这实际上是什

  • 来自Teradata,我通常会创建一个包含一些变量的易失性表,我会在代码中使用这些变量。 例如。, 然后我会在SELECT WHERE子句中使用该表: 我试图在色调(Impala editor)中执行类似的操作,但遇到了一个错误: AnalysisException:第5行中的语法错误:未定义:来自表名隐藏^遇到:来自预期的:大小写、强制转换、默认值、存在、FALSE、IF、INTERVAL、NO