我有一个包含5行的Payment
模型。其中4个具有相同的user_id,另一个具有不同的user_id。我尝试通过user_id对这些结果进行分组。它应该返回两个结果,但是在尝试这个时我总是得到五个结果。知道为什么吗?
(我正在使用Postgres)
Payment.find(:all, group: "user_id,id").count
=> 5
也试过
Payment.find(:all, group: "id,user_id").count
=> 5
更新:如果我没有添加“user_id”我收到此错误
ActiveRecord::StatementInvalid: PG::Error: ERROR: column "payments.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "payments".* FROM "payments" GROUP BY user_id
^
: SELECT "payments".* FROM "payments" GROUP BY user_id
更新2:此查询
Payment.joins(:user).select('payments.id,users.username,payments.user_id,payments.token,payments.period_start_at,payments.amount_cents,payments.currency').group("user_id")
返回PG::Error: ERROR: column "payments.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT payments.id,users.username,payments.user_id,payments....
^
如果我将“payments.id”添加到group子句中,它将不会按user_id对它们进行分组。有什么想法吗?
答案 0 :(得分:1)
嗯,您无法按id
对其进行分组,因为id
可能是您桌上的serial
唯一键。仅按user_id
分组。
已更新
显然你正在使用rails v 2.3.*
或其他东西。此外,这是数据库知识。 SQL
中的查询将如下所示:
SELECT COUNT(user_id), user_id FROM payments GROUP BY user_id
#=> user_id | count
10 2
3 1
4 10
这将为您提供某些用户拥有的付款数量。要将此转换为ActiveRecord
查询,您必须执行以下操作:
Payment.count(:group => :user_id)
答案 1 :(得分:0)
您按id
进行分组。 id
是唯一的。你必须有5组,每组一条记录。你不能(有意义地)按id
分组。
您还使用了过时的find(:all, ...)
语法。请改用Payment.group("user_id")
。