【问题标题】:Can this query be rewritten more efficiently? [closed]可以更有效地重写此查询吗? [关闭]
【发布时间】:2013-03-12 13:56:32
【问题描述】:

我有一个这样的 SQL 查询:

select * 
from orders 
where order_session_id IN ( 
   select id order_status 
   from order_sessions 
   where order_status IN (
      select id 
      from order_status_types 
      where order_status != "Paid"
   )
)

这返回了一个哈希值。我用 ruby​​ 编写了它,但我觉得它可以优化。

@orders = []
paid_order_status_id = OrderStatusType.find_by_order_status("Paid").id
OrderSession.where('order_status != ?',paid_order_status_id).each { |unpaid_order|
  @orders << Order.find(unpaid_order.id)
}

【问题讨论】:

  • @CoderSeven 你知道 OP 不是在处理 Raw SQL 而是在处理活动记录吗?
  • @CoderSeven 好吧,你没有处理 SQL,所以连接是无关紧要的。 Rails 会自动连接。 Post.find(1).users 查找所有具有post_id = 1 的用户
  • 啊,你知道的越多!谢谢。我熟悉 ORM,而不是 ActiveRecord。
  • 您能否将您的模型关联包含在 order、order_session 和 order_status_type 中?

标签: sql ruby-on-rails ruby activerecord


【解决方案1】:

假设你有以下关联

OrderSession belongs_to Order
Order has_one OrderSession

你试试

@orders = Order.joins(:order_session).where('order_sessions.order_status != ?', paid_order_status_id)

【讨论】:

  • 您忘记使用占位符“?”:@orders = Order.joins(:order_session).where('order_sessions.order_status != ?', paid_order_status_id)
  • 谢谢!刚刚添加它:)
猜你喜欢
  • 1970-01-01
  • 2012-06-27
  • 2011-09-05
  • 1970-01-01
  • 2020-05-17
  • 2012-01-19
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
相关资源
最近更新 更多