如何将我的 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 列:
- 您分组的列,并且按分组的列是暂时的(例如分组 recipes.id 也可以 select recipes.title)
- 和聚合列(计数、总和、最大值)
尝试:
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)
我正在尝试根据收到的点赞数对我数据库中的所有食谱进行排序。点赞是多态的,属于: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 列:
- 您分组的列,并且按分组的列是暂时的(例如分组 recipes.id 也可以 select recipes.title)
- 和聚合列(计数、总和、最大值)
尝试:
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)