【问题标题】:how to make sql in Active relation which has subquery in from clause如何在 from 子句中有子查询的 Active 关系中创建 sql
【发布时间】:2014-10-14 23:49:01
【问题描述】:

我必须使用 Active Relation 进行 SQL 查询。

select * from (select * from purchase_order_items order by created_at desc) as abc where (fsn = '9788183071000' and sku ='SKU0000000000000') 或 (fsn = 'BAGD7SHVZZPPVAZH' 和 sku ='SKU0000000000000') 或 (fsn = 'CAMCUTS25Z2HSFE8' 和 sku ='SKU0000000000000') 按 fsn 分组,sku

什么是最好的和优化的方法。我试过了

PurchaseOrderItem.where("(fsn = '9788183071000' 和 sku ='SKU0000000000000') 或 (fsn = 'BAGD7SHVZZPPVAZH' 和 sku ='SKU0000000000000') 或 (fsn = 'CAMCUTS25Z2HSFE8' 和 sku ='SKU0000000000000')").order('created_at')

但是组没有按要求发生。表由rails中的模型名称决定。 有没有办法进行上述查询?

我不想将它作为普通查询传递。

【问题讨论】:

    标签: mysql sql ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    也许只是我,但我认为以下 sql 查询将返回与您的查询相同的结果:

    SELECT * 
      FROM purchase_order_items
      WHERE (fsn = '9788183071000'    AND sku ='SKU0000000000000') 
         OR (fsn = 'BAGD7SHVZZPPVAZH' AND sku ='SKU0000000000000') 
         OR (fsn = 'CAMCUTS25Z2HSFE8' AND sku ='SKU0000000000000')
      GROUP BY fsn ,sku
      ORDER BY created_at DESC;
    

    如果是这样,那么你可以在 Rails 中这样写:

    combinations = [['9788183071000', 'SKU0000000000000'], ['BAGD7SHVZZPPVAZH', 'SKU0000000000000'], ['CAMCUTS25Z2HSFE8', 'SKU0000000000000']]
    
    PurchaseOrderItem.where(
      Array.new(combinations.size, '(fsn = ? and sku = ?)').join(' OR '),
      combinations.flatten
    ).group('fsn, sku').order('created_at DESC')
    

    【讨论】:

    • @T.J.它有什么不同?您能否提供更多详细信息:您的数据和表格的外观以及您期望查询返回的示例。从我的角度来看,您的查询和我的查询之间的唯一区别是缺少 order 子句。 group 不保证保留给定的订单。因此,IMO 那部分是无用的(或导致不可预测的结果)。如果您想要某个订单,您应该订购您应该在第二步订购。我更新了我的答案,请再次检查。
    【解决方案2】:

    您可以使用 Arel 来进行组合 SQL 查询。

    p = PurchaseOrderItem.arel_table
    User.where((p[:fsn].eq('9788183071000').and(p[:sku].eq('SKU0000000000000')).or(p[: fsn].eq('BAGD7SHVZZPPVAZH').and(p[:sku].eq('SKU0000000000000')).or(p[: fsn].eq('CAMCUTS25Z2HSFE8').and(p[:sku].eq('SKU0000000000000'))).order("fsn, sku") 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多