Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Rails选择子查询(如果可能,不使用finder\u sql)_Mysql_Sql_Ruby On Rails_Activerecord_Subquery - Fatal编程技术网

Mysql Rails选择子查询(如果可能,不使用finder\u sql)

Mysql Rails选择子查询(如果可能,不使用finder\u sql),mysql,sql,ruby-on-rails,activerecord,subquery,Mysql,Sql,Ruby On Rails,Activerecord,Subquery,我有一个叫做Object的模型,它实际上并不重要 它有一个默认的价格列,称为价格 还有一个Schedule对象,它允许覆盖特定日期的价格 我希望能够确定最低价格,根据定义,这是SQL查询期间默认价格和当前价格之间的最低价格,以便能够按照计算出的最低价格进行订购 我想使我的搜索查询尽可能高效,我想知道我是否可以 这样做: Object.select("id AS p_id, id, (SELECT MIN(`schedules`.`price`) FROM `schedules` WHERE `s

我有一个叫做Object的模型,它实际上并不重要

它有一个默认的价格列,称为价格

还有一个Schedule对象,它允许覆盖特定日期的价格

我希望能够确定最低价格,根据定义,这是SQL查询期间默认价格和当前价格之间的最低价格,以便能够按照计算出的最低价格进行订购

我想使我的搜索查询尽可能高效,我想知道我是否可以 这样做:

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 ....)
所以,正如你所看到的,它不起作用。首先,它加载objects表中的所有列,其次,它看起来很糟糕

我不想使用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)

检查语法,您的SQL中有一些不平衡的括号和反勾号。@PinnyM我刚才复制粘贴速度非常快,对此表示抱歉。谢谢您的回答。我现在无法检查它,但它是否能与其他联接一起工作?当然,只需在联接字符串后面添加它们,逗号分隔。我有如下内容:Object.joins{subquery}schedules ON objects.p_id=schedules.Object_id.joins:tags.select'objects.*,schedules.min_price.limit5这样行吗当然您可以将多个JOIN语句链接在一起,因此这应该可以正常工作。您好。我有机会试用你的代码,但它不起作用。它生成以下SQL:选择对象。*,schedules.min\u price FROM objects选择MINprice作为min\u price,object\u id FROM schedules GROUP BY object\u id schedules ON objects.id=schedules.object\u id LIMIT 5您知道如何修复它吗