【问题标题】:column "likes.id" must appear in the GROUP BY clause or be used in an aggregate function列“likes.id”必须出现在 GROUP BY 子句中或在聚合函数中使用
【发布时间】:2021-06-25 02:24:27
【问题描述】:

所以我正在尝试使用 postgresql 为我的 Sinatra 项目添加热门帖子功能,并使用以下语句 Like.group(:exercise_id).order('COUNT(exercise_id) DESC').each do |like|

但是当我尝试这个时,我收到一条错误消息column "likes.id" must appear in the GROUP BY clause or be used in an aggregate function

当我添加这个 Like.group(:exercise_id, :id).order('COUNT(exercise_id) DESC')

当我只想按喜欢分组时,它给了我整张桌子。有解决办法吗?

【问题讨论】:

  • Like.group(:exercise_id).order('COUNT(exercise_id) DESC').to_sql 生成什么 SQL 查询?

标签: ruby postgresql sinatra


【解决方案1】:

错误告诉您的是,您正在选择“likes.id”,但数据库无法为您提供一个 likes.id。

这是因为默认情况下,当你不告诉 Rails 你需要什么时,Rails 会选择一切。

想一想,你真的需要“likes.id”吗?在我看来,您是按 exercise_id 分组的,所以您想要得到的是练习和类似的计数。 (如果我错了,请纠正我。)您实际上并不需要像 id-s 这样的特定对象。

如果是这样,我们需要告诉 Rails 我们的意图。

Like.group(:exercise_id).order('COUNT(exercise_id) DESC').select(:exercise_id)

如果您还需要计数本身,只需将其添加到选择中即可。

您可能想尝试的其他方法就是.count。它非常聪明,并且会尊重您的分组。看看这是否有帮助。

Like.group(:exercise_id).count

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 2013-11-05
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多