【问题标题】:Distinct Records with joins and order具有连接和顺序的不同记录
【发布时间】:2014-02-23 15:23:49
【问题描述】:

我在UserDonations 之间有一个简单的关系,一个用户有很多捐款,一个捐款属于一个用户。 我想做的是获取用户列表,按最近的捐款排序。

这是我正在尝试的:

首先我想获取 uniq 用户的总数,它按预期工作:

> User.joins(:donations).order('donations.created_at').uniq.count
   (3.2ms)  SELECT DISTINCT COUNT(DISTINCT "users"."id") FROM "users" INNER JOIN "donations" ON "donations"."user_id" = "users"."id"
 => 384

接下来,当我删除count 方法时,我收到“ORDER BY 表达式必须出现在选择列表中”的错误:

> User.joins(:donations).order('donations.created_at').uniq
  User Load (0.9ms)  SELECT DISTINCT "users".* FROM "users" INNER JOIN "donations" ON "donations"."user_id" = "users"."id" ORDER BY donations.created_at
PG::InvalidColumnReference: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 1: ...ON "donations"."user_id" = "users"."id"  ORDER BY donations....

然后我尝试通过显式设置乍一看似乎有效的 SELECT 子句来修复 Postgres 错误:

 > User.select('DISTINCT "users".id, "users".*, "donations".created_at').joins(:donations).order('donations.created_at')
  User Load (17.6ms)  SELECT DISTINCT "users".id, "users".*, "donations".created_at FROM "users" INNER JOIN "donations" ON "donations"."user_id" = "users"."id" ORDER BY donations.created_at

但是返回的记录数没有考虑DISTINCT语句,返回692条记录:

> _.size
 => 692

如何在按捐赠的 created_at 时间戳排序的同时获得预期的结果数 (384)?

【问题讨论】:

  • 我想当你说DISTINCT "users".id, "users".*, "donations".created_at 服务器解释为:每个元素的一个结果在其所有字段中都是唯一的

标签: ruby-on-rails postgresql ruby-on-rails-4 join sql-order-by


【解决方案1】:

试试这个:

User.select('users.*,MAX(donations.created_at) as most_recent_donation').
  joins(:donations).order('most_recent_donation desc').group('users.id')

我假设一个用户有很多捐赠,这将选择最近创建的捐赠,并选择按他们的 id 过滤的不同用户。

不过我还没有测试过。

【讨论】:

  • 使用 group('users.id') 我得到一个 postgres 错误“列“donations.created_at”必须出现在 GROUP BY 子句中或用于聚合函数中”
  • 您更新的答案对我有用,谢谢!我所做的唯一更改是使用order('most_recent_donation DESC'),因为我将它与Kaminari pagination 一起使用,并且首先想要最近的捐助者。
  • 啊我明白了,很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
相关资源
最近更新 更多