【问题标题】:How to approach GROUP BY in PostgreSQL using Rails?如何使用 Rails 在 PostgreSQL 中处理 GROUP BY?
【发布时间】:2010-12-27 23:42:18
【问题描述】:

我有一个保持高分的 Rails 3 应用程序。我将它托管在使用 postgresql 作为数据库的 Heroku 上。

我需要从分数表中提取最高分。该表包含scoreuser_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: column id_list.alias_0 does not存在第 1 行:...作为 id_list ORDER BY id_list.al..."。我什至没有说明名称为“id_list”的列,所以我不明白为什么会出现这种情况。

标签: ruby-on-rails postgresql ruby-on-rails-3


【解决方案1】:

这意味着您的选择查询正在选择“id”列,但未将其包含在 group by 子句中。我不熟悉 Rails,但它可以选择 * 还是所有列?

【讨论】:

    【解决方案2】:

    可以吗

    select id, max(score) group by id;
    

    【讨论】:

    • 我想看看出错的查询,因为上面的查询应该不会产生错误。
    • Score.select('user_id, score, max(score)').group('user_id').limit(25) 与 mysql 一起工作,但与 postgresql 相同。
    • 这与我的查询不同,您是在不按它分组或使用聚合的情况下要求分数。使其类似于 score.select('user_id,max(score)').group('user_id').limit(25) 如果您需要所有分数,那么 group by 无论如何都不是正确的选择。
    • 嗨,斯科特,首先,感谢您的回复。您的查询有效,但我需要列出分数。如果我不像上面那样在选择语句中使用“分数”,我会收到错误“缺少属性:分数”。如果我调用@high_scores = Score.select('user_id,max(score)').group('user_id').limit(25),我不能调用@high_score.score。有没有办法解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多