如何将我的 SQLite3 查询转换为 postgreSQL?

How do I translate my SQLite3 query to postgreSQL?

我正在尝试根据收到的点赞数对我数据库中的所有食谱进行排序。点赞是多态的,属于: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

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

您不能 select * 从分组依据。

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

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

尝试:

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

您需要明确 select 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)