【问题标题】:How to join products and their characteristics如何加入产品及其特点
【发布时间】:2016-03-16 16:54:03
【问题描述】:

如何加入产品及其特点

我有两张桌子。 产品(id、标题、价格、created_at、updated_at 等) 和 ProductCharacteristic(id、product_id、sold_quantity、date、craated_at、updated_at 等)。

我应该在一段时间内显示产品表(标题是 product.id、product.title、product.price、sold_quantity),并按标题中的任何字段排序。

而且我不能写查询

现在我有以下查询

 > current_project.products.includes(:product_characteristics).group('products.id').pluck(:title, 'SUM(product_characteristics.sold_quantity) AS sold_quantity')

(45.4ms) SELECT "products"."title", SUM(product_characteristics.sold_quantity) AS sold_quantity FROM "products" LEFT OUTER JOIN "product_characteristics" ON "product_characteristics"."product_id" = "products"."id" WHERE "products"."project_id" = $1 GROUP BY products.id  [["project_id", 20]]

请帮助我通过 orm 编写查询(添加 where 日期和排序)或编写原始 sql 查询。

我用采摘。它返回数组数组(不是哈希数组)。这当然不是很好。

product_characteristics.date 字段在 product_id 范围内是唯一的。但是请给我两个例子(有这个条件和没有它以满足我的好奇心)。

我使用 postgresql 和 rails 4.2.x 附言顺便说一下,ProductCharacteristic 表会有很多记录(超过一百万)。我应该使用 postgresql 表分区吗?它可以提高性能吗?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    在这种情况下,您可以使用 select 而不是 count,并且该属性将作为 product.sold_quantity 访问

    查询变为

    products = current_project.products.joins(:product_characteristics).group('products.id').select(:title, 'SUM(product_characteristics.sold_quantity) AS sold_quantity')
    

    products.first.sold_quantity # => 有效

    要订购,您只需添加一个订购子句

    products = products.order(id: :asc)
    

    products = products.order(id: :desc)
    

    例如

    对于哪里

    products = products.where("created_at > ?", 2.days.ago)
    

    例如。

    您可以在第一行之后链接 sql 子句,这无关紧要,因为只有在您实际使用检索到的集合时才会启动查询。 所以你也可以做类似的事情

    if params[:foo]
      products = products.order(:id)
    end
    

    【讨论】:

    • 没有。我不能使用选择
    • > current_project.products.includes(:product_characteristics).group('products.id').select(:title, 'SUM(product_characteristics.sold_quantity) AS sold_quantity') PG::UndefinedTable: ERROR :缺少表“product_characteristics”第 1 行的 FROM 子句条目:选择“products”。“title”,SUM(product_characteristics.sold_... ^:选择“products”。“title”,SUM(product_characteristics.sold_quantity)AS sold_quantity FROM "products" WHERE "products"."project_id" = $1 GROUP BY products.id => #<:activerecord_associationrelation:0x3fd8e44ad894>
    • 哦,是的,尝试使用连接而不是包含
    • 好的,我使用带有 LEFT OUTER JOIN 的连接,但是如何按 sold_quantity 订购?
    • 抱歉,我使用了符号(订单(sold_quantity: :desc)),它只适用于字符串。好的。非常感谢。我应该使用 select 而不是 pluck,一切都会好起来的。我在询问之前尝试使用它,但它返回的结果类似于 [#, #,我认为我可以得到 sold_quantity .所以我在这里问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多