也许,这个问题有点愚蠢,但我很困惑。
如何按指定列对记录进行分组? :)
Item.group(:category_id)
不起作用......
它说:
ActiveRecord :: StatementInvalid:PGError:错误:列“items.id”必须出现在GROUP BY子句中或用于聚合函数 第1行:选择“项目”。* FROM“items”GROUP BY category_id
我应该使用什么样的聚合函数?
拜托,您能提供一个简单的例子。
答案 0 :(得分:2)
您必须定义,如何对共享相同category_id
的值进行分组。连接它们?计算总和?
要创建以逗号分隔的值列表,您的语句可能如下所示:
SELECT category_id
,string_agg(col1, ', ') AS col1_list
,string_agg(col2, ', ') AS col2_list
FROM items
GROUP BY category_id
string_agg(col1, ', ')
需要Postgres 9.0或更高版本。
在旧版本中,您可以使用array_to_string(array_agg(col1), ', ')
替换。更多聚合函数here。
在PostgreSQL中聚合值是明显优越的方法,而不是在客户端聚合值。 Postgres 非常快,它减少了(网络)流量。
答案 1 :(得分:1)
您可以使用sum
,avg
,count
或任何其他聚合函数。有关此主题的更多信息,请参阅here。
但似乎你真的不需要使用SQL分组。
尝试获取所有记录,然后使用Array#collect
功能将Item
分组为category_id
答案 2 :(得分:1)
在SQL中分组意味着服务器将 一个或多个记录从数据库表转换为一个结果行。因此,如果您按category_id
分组,则可能有多条记录与给定类别匹配,因此您不能指望数据库从表中返回所有列(这就是{ {1}}确实如此)。
相反,当您使用SELECT *
时,您只能GROUP BY
:
根据您的确切需要,相应地修改SELECT
。