后发现基于建立关系的最古老元素的属性来编写SQL查询



给定以下示例datamodels/表:(在伪卢比/铁轨中指定出于简洁的缘故(

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"标识符字段,该字段是其主要键,并且连接OrderProduct的表也存在(

我想选择所有用户,例如他们的最古老的顺序(最早的ordered_at(包含超过 n 产品。

如何完成?

到目前为止,我尝试过的是:我尝试使用JOIN,但随后我们最终会查看 all 订单,而不仅仅是最古老的订单。我还尝试使用DISTINCT/DISTINCT ON,但我不知道如何将其与(a(选择用户正确组合以及(b(对所有相关产品的计数进行检查。

我正在使用Postgres,但是如果存在DB-Agnostic SQL答案,那也将不胜感激。

在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

最新更新