【问题标题】:How to join in rails active record using alias如何使用别名加入 Rails 活动记录
【发布时间】:2019-11-27 12:15:06
【问题描述】:

我正在尝试将以下 SQL 转换为 Rails 活动记录查询

"SELECT  * FROM    stocks
        INNER JOIN
        (
            SELECT  product_id, MIN(ask_price) min_price
            FROM    stocks
            GROUP   BY product_id,size
        ) sub ON  stocks.product_id = sub.product_id AND
                stocks.ask_price = sub.min_price
                where stocks.product_id = 1"

此查询按产品和产品尺寸获取库存组的最低价格。

到目前为止,我都尝试过这样翻译它是不对的。

sub_query = Stock.select("product_id, MIN(ask_price) min_price").group(:product_id,:size)
stocks = Stock.joins("#{sub_query} stocks.product_id = sub.product_id AND
                stocks.ask_price = sub.min_price")

【问题讨论】:

  • 您在那里选择了大量冗余数据。一个好的提示是永远不要使用SELECT *

标签: mysql ruby activerecord ruby-on-rails-5


【解决方案1】:

如果你想做一些自定义加入,你应该把你所有的join 子句传递给joins 方法,像这样:

stocks = Stock.joins(<<-SQL
  INNER JOIN
  (
    SELECT product_id, MIN(ask_price) min_price
    FROM stocks
    GROUP BY product_id, size
  ) sub ON stocks.product_id = sub.product_id AND stocks.ask_price = sub.min_price
SQL).where(product_id: 1)

【讨论】:

  • 我会将格式更改为stocks = Stock.joins(&lt;&lt;~SQL.squish).where(product_id: 1),后跟此处的文档文本,而不是在整个此处的文档之后加上右括​​号。
  • @marek_lipka 非常感谢您的回答,但是除了 .where(product_id: 1) 部分之外,它不是更像插入原始 sql,我们不能将内部联接查询更改为 Active记录查询。
  • @Prem 如果我们想像这样执行自定义INNER JOIN 查询(带有嵌套查询),我们不能。 AR 只能“自动”执行相对简单的 INNER JOINLEFT OUTER JOIN 查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多