查询以选择所有商店中所有最古老的书籍

时间:2019-06-11 18:59:30

标签: ruby-on-rails postgresql

给出一个简单的Book / Shop关联,如下所示,并假设Book的日期为published_on

class Shop
  has_many :books
end

class Book
  belongs_to: shop
end

您将如何构建PostgreSQL查询,以返回其所属商店发布的所有最旧书籍。

因此,如果您有此数据集(日期格式为YYYY-MM-DD):

  • 商店A:
    • 图书A1-发布时间:2019-01-01
    • 图书A2-发布时间:2019-02-01
    • 图书A3-发布日期:2019-03-01
  • 商店B:
    • 图书B1-发布时间:2019-04-01
    • 图书B2-发布时间:2019-04-01
    • 图书B3-发布时间:2019-05-01
  • 商店C:
    • 图书C1-发布日期:2019-02-01
    • 书C1-发布日期:2019-06-01

它应该返回:

  • 图书A1-发布时间:2019-01-01
  • 图书B1-发布时间:2019-04-01
  • 图书B2-发布时间:2019-04-01
  • 图书C1-发布日期:2019-02-01

我知道如何通过Shop获取所有published_on个日期:

Book.select('shop_id, min(published_on) as min_pub').group(:shop_id)

但是我不确定下一步要去哪里,或者甚至有用。

2 个答案:

答案 0 :(得分:1)

我相信您需要使用到目前为止作为子查询使用的查询来获取书籍列表:

SELECT books.*
FROM books
INNER JOIN
(
  SELECT shop_id, min(published_on) as min_pub
  FROM "books"
  GROUP BY shop_id
) AS jt ON jt.min_pub = books.published_on
        AND jt.shop_id = books.shop_id

我不确定Active Record是否可以帮助构建此子查询...我唯一能想到的就是:

subquery = Book.select('shop_id, min(published_on) as min_pub').group(:shop_id).to_sql
Book.joins(
  "INNER JOIN (#{subquery}) AS jt ON jt.min_pub = books.published_on AND jt.shop_id = books.shop_id"
)

希望对您有帮助...

答案 1 :(得分:0)

应该是sql查询:

SELECT * FROM books
JOIN shop on books.shop_id = shops.id
ORDER BY books.published_on
GROUP BY shop

转换为Active Record可能看起来像这样: Books.joins(:shops).order(:published_on).group(shop.id)

我对分组部分不是很确定:)让我知道结果是什么,我们可以一起弄清楚