【问题标题】:How do I translate my SQLite3 query to postgreSQL?如何将我的 SQLite3 查询转换为 postgreSQL?
【发布时间】:2021-07-17 04:56:16
【问题描述】:

我正在尝试按照他们收到的点赞数对我的数据库中的所有食谱进行排序。点赞是多态的,属于:likeable,而一个菜谱有很多点赞。

我的查询适用于 SQLite3,但是当我使用 PostgreSQL 上传到 Heroku 时,它似乎破坏了一些东西。

功能如下:

Recipe.select('*').joins(:likes).group('recipes.id').order('COUNT(likes.likeable_id)')

当我尝试运行网站时 Heroku 给我的错误:

ActionView::Template::Error (PG::GroupingError: ERROR:  column "likes.id" must appear in the GROUP BY clause or be used in an aggregate function

一切都可以编译,但主页使用了该范围函数,所以我立即收到服务器错误。

【问题讨论】:

  • 好吧,就像消息说的那样,将该列添加到GROUP BY

标签: ruby-on-rails postgresql sqlite activerecord heroku-postgres


【解决方案1】:

您需要明确选择recipies.*

Recipe.select(
         Recipe.arel_table[:*], 
         Likes.arel_table[:*].count.as('likes_count')
      )
      .joins(:likes)
      .group(:id)
      .order(:likes_count)

选择计数实际上是可选的 - 您可以完全跳过 .select 并在 order 子句中获取聚合:

Recipe.joins(:likes)
      .group(:id)
      .order(Likes.arel_table[:*].count)

【讨论】:

  • 谢谢!我意识到我在小组声明中过于具体了。我改变了一切,只使用.group[:id],ActiveRecord 能够为我理解事情。我使用的代码如下:Recipe.joins(:likes).group(:id).order('COUNT(likes.id) DESC')
【解决方案2】:

您不能从分组依据中选择 *。

对于大多数 SQL 数据库(Postgres、较新的 Mysql、...),您只能在 GROUP BY 中使用 SELET 列:

  1. 您已分组的列,并且按分组列是临时的(例如,分组 recipes.id 也可以选择 recipes.title)
  2. 和聚合列(计数、总和、最大值)

试试:

Recipe.select('recipies.*').joins(:likes).group(:id).order('COUNT(likes.likeable_id)')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多