Как написать SQL-запрос, основанный на свойствах самого старого элемента отношения has-many? - PullRequest
0 голосов
/ 25 мая 2019

Для следующих примеров моделей / таблиц данных: (для краткости указано в псевдо-Ruby / Rails)

class User
  has_many :orders
end
class Order
  has_and_belongs_to_many :products
  ordered_at :timestamp
end
class Product
  name :string
  price :decimal
end

(и каждая из этих таблицтакже имеет уникальное поле идентификатора 'id', которое является его первичным ключом, и таблица соединений, соединяющая Order и Product также существует)

Я хотел бы выбрать всех пользователей, для которых, например, их Самый старый Заказ (с самым ранним ordered_at), содержит более n продуктов.

Как это можно сделать?

Что я пробовалдо сих пор: я попытался использовать JOIN, но затем мы в итоге посмотрим все ордера, а не только самые старые.Я также пытался использовать DISTINCT / DISTINCT ON, но я не представляю, как это правильно сочетать с (а) выбором пользователей и (б) проверкой количества всех связанных продуктов.

Я использую Postgres, но если существует независимый от DB ответ на SQL, это также будет высоко оценено.

1 Ответ

1 голос
/ 25 мая 2019

В Postgres я бы сформулировал это, используя distinct on. Основная идея будет:

select o.*
from (select distinct on (o.user_id) o.user_id, o.order_id, o.ordered_at, count(*) as num_products
      from orders o join
           orderproducts op
           on op.order_id = o.order_id
      group by o.user_id, o.order_id, o.ordered_at
      order by o.user_id, o.ordered_at asc
     ) o
where num_products >= n
...