【发布时间】:2018-02-09 14:01:01
【问题描述】:
我正在尝试查询我的 PostgreSQL 数据库以获取最新的(通过 created_at)和不同的(通过 user_id)活动对象,其中每个用户在数据库中都有多个活动。活动对象的结构如下:
Activity(id, user_id, created_at, ...)
我首先尝试让以下查询工作:
Activity.order('created_at DESC').select('DISTINCT ON (activities.user_id) activities.*')
但是,不断收到以下错误:
ActiveRecord::StatementInvalid: PG::InvalidColumnReference: ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
根据这篇文章:PG::Error: SELECT DISTINCT, ORDER BY expressions must appear in select list,看起来 ORDER BY 子句只能在应用了 DISTINCT 之后才能应用。这对我没有帮助,因为我想通过 user_id 获得不同的活动,但也希望这些活动是最近创建的活动。因此,我需要在获得不同的活动之前对活动进行排序。
我提出了一个可行的解决方案,但首先按用户 ID 对活动进行分组,然后按 created_at 对组内的活动进行排序。但是,这需要执行两个查询。
我想知道我想要的是否仅在一个查询中就可以实现?
【问题讨论】:
-
如果你在 distinct 之后排序,你仍然会得到最近创建的活动。