给出一个简单的Book / Shop关联,如下所示,并假设Book的日期为published_on
。
class Shop
has_many :books
end
class Book
belongs_to: shop
end
您将如何构建PostgreSQL查询,以返回其所属商店发布的所有最旧书籍。
因此,如果您有此数据集(日期格式为YYYY-MM-DD):
它应该返回:
我知道如何通过Shop获取所有published_on
个日期:
Book.select('shop_id, min(published_on) as min_pub').group(:shop_id)
但是我不确定下一步要去哪里,或者甚至有用。
答案 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)
我对分组部分不是很确定:)让我知道结果是什么,我们可以一起弄清楚