如何在Rails中使用PostgreSQL进行GROUP BY操作?

6
我有一个Rails 3应用程序,用于保留高分。我将其托管在使用postgresql作为数据库的Heroku上。
我需要从得分表中提取最高分数。该表具有score和user_id列。在mysql中,以下命令可以正常工作:
Score.order('score DESC').group('user_id').limit(25)
这会排名每个用户的最高分数。
当我将应用程序放在Heroku上时,我收到以下psql错误:PGError: ERROR: column "scores.id" must appear in the GROUP BY clause or be used in an aggregate function
我已经阅读了相关资料,但没有找到明确的答案。重新创建上述查询以与PostgreSQL配合使用的最佳方法是什么?
谢谢!

我正在尝试使用其他人提到的DISTINCT ON。Score.select('DISTINCT ON (user_id) id, user_id, score').order('user_id, score DESC').limit(25)但是我收到以下错误:“PGError:ERROR:列id_list.alias_0不存在 LINE 1: ... AS id_list ORDER BY id_list.al...”。我甚至没有声明一个名为'id_list'的列,所以我不明白为什么会出现这种情况。 - Tim
2个回答

2
这意味着您的选择查询正在选择“id”列,但未在group by子句中包含它。我不熟悉rails,但它是否选择*或所有列?

0

你能做吗?

select id, max(score) group by id;

我想看一下出错的查询,因为上面那个查询不应该产生任何错误。 - Scott Marlowe
Score.select('user_id, score, max(score)').group('user_id').limit(25) 在 MySQL 中可以运行,但在 PostgreSQL 中会出现相同的错误。 - Tim
这与我的查询不同,您正在请求得分而没有按其进行分组或使用聚合。请将其更改为以下内容:score.select('user_id,max(score)').group('user_id').limit(25)如果您需要所有分数,则无论如何都不应该使用分组。 - Scott Marlowe
嗨,Scott,首先感谢您的回复。您的查询有效,但我需要列出分数。如果我不像上面那样在选择语句中使用“score”,我会收到错误消息“缺少属性:score”。如果我调用@high_scores = Score.select('user_id,max(score)').group('user_id').limit(25),我无法调用@high_score.score。有没有解决方法? - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接