【问题标题】:activerecord sql difficult queryactiverecord sql 难查询
【发布时间】:2013-11-06 09:20:00
【问题描述】:

我需要使用两个选项进行查询:第一个 - 选择 DISTINCT ON,第二个 - 排序(和其他字段排序)。顺便说一句,不工作

在一个 sql 论坛我找到了解决方案

WITH d AS (
SELECT DISTINCT ON ({Dlist}) {slist}
FROM {flist}
....
)
SELECT * FROM d ORDER BY {order fields}

那么,我怎样才能通过 ActiveRecord 方法做到这一点并取回 ActiveRecord::Relation

我的完整查询看起来是这样的:

WITH d AS (
SELECT DISTINCT ON(item_info_id, volume) items.item_info_id, items.volume, items.* 
FROM "items" INNER JOIN "item_info" ON "item_info"."id" = "items"."item_info_id" WHERE "items"."type" IN ('Product') 
AND "items"."published" = 't' 
AND ("items"."item_info_id" IS NOT NULL) 
AND ("items"."price" BETWEEN 2 AND 823489)\
)
SELECT * FROM d ORDER_BY 'price'

【问题讨论】:

  • 你能给我们展示一个有效的mysql查询示例吗,我的意思是完整的查询
  • 当然。查看完整的 postgresql 查询。我在 activerecord 中需要这样的东西,它将返回 ActiveRecord::Relation
  • 顺便说一句,你想描述一下这个查询的输出,就好像你在告诉你的产品经理一样。您知道需要花费一些时间来了解这是做什么的。

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


【解决方案1】:

下面可能对你有用或给你一些提示

class Item < ActiveRecord::Base
  def self.what_you_want_to_achieve
    item_ids = where("item_info_id IS NOT NULL")
              .select(" DISTINCT on(item_info_id, volume) items.item_info_id, items.volume, items.id ")
              .map(&:id)

    where(:id => item_ids).published.products.price_between(2,823489).order(:price)
  end

我假设您知道如何定义scope,例如published

【讨论】:

  • 我认为它会起作用。非常感谢,伙计。请稍等,我试试看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多