Запрос, чтобы выбрать все самые старые книги всех магазинов - PullRequest
0 голосов
/ 11 июня 2019

Учитывая простую ассоциацию Book / Shop, как указано ниже, и при условии, что Book имеет published_on Date.

class Shop
  has_many :books
end

class Book
  belongs_to: shop
end

Как бы вы создали запрос PostgreSQL, который возвращает все книги, для которых самые старые опубликованы длямагазин, к которому они принадлежат.

Так что, если у вас есть этот набор данных (формат даты ГГГГ-ММ-ДД):

  • Магазин A:
    • Книга А1 - опубликовано: 2019-01-01
    • Книга А2 - опубликовано_: 2019-02-01
    • Книга А3 - опубликовано: 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

Возвращается:

  • Книга А1 - опубликовано: 2019-01-01
  • Книга В1 - опубликовано: 2019-04-01
  • Книга В2 - опубликовано: 2019-04-01
  • Книга С1 - опубликованоhed_on: 2019-02-01

Я знаю, как получить все published_on даты по магазинам:

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

Но я не уверен, куда идти дальше, илиесли это даже полезно.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Я полагаю, что вам нужно использовать ваш запрос в качестве подзапроса, чтобы получить список книг:

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"
)

Надеюсь, это поможет ...

0 голосов
/ 11 июня 2019

Это должен быть 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)

Я не совсем уверен насчет группировки :) Дайте мне знать, каков результат, и мы можем понять это вместе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...