【发布时间】:2014-02-23 15:23:49
【问题描述】:
我在User 和Donations 之间有一个简单的关系,一个用户有很多捐款,一个捐款属于一个用户。 我想做的是获取用户列表,按最近的捐款排序。
这是我正在尝试的:
首先我想获取 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