MySQL:使用.group()时,包含非聚合列错误Rails 5.2

时间:2019-02-06 05:44:40

标签: mysql ruby-on-rails rails-activerecord mysql-error-1064

我正在研究Rails 5.2项目,并尝试通过表中的字段对ActiveRecord::Relation进行分组:

rails控制台中的以下内容返回错误:

2.4.0 :015 > Post.group(:published)
  Post Load (3.9ms)  SELECT  `posts`.* FROM `posts` GROUP BY `posts`.`published` LIMIT 11
ActiveRecord::StatementInvalid: Mysql2::Error: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'app_dev.posts.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by: SELECT  `posts`.* FROM `posts` GROUP BY `posts`.`published` LIMIT 11

但是,添加.sum()可以正确运行,没有错误...

> Post.group(:published).sum(:views)

是否有第一个查询会失败的原因,而不是第二个?

在schema.rb

create_table "post", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
  t.string "title", null: false
  t.text "body", null: false
  t.boolean "published", null: false, default: false
  t.bigint "views", null: false, default: 0
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

谢谢

1 个答案:

答案 0 :(得分:0)

第一种情况下的问题是您以only_full_group_by模式运行mysql,这意味着您的select语句中不能有不依赖于{{3}中的列的列}:

MySQL 5.7.5及更高版本实现对功能依赖性的检测。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),则MySQL拒绝查询,其中选择列表,HAVING条件或ORDER BY列表引用的是未在GROUP BY子句中命名且在功能上不依赖于它们的非聚合列

如果查看Rails生成的第二个查询,您会发现sum方法将聚合函数SUM(views)添加到选择列表中,并将其他属性限制为group方法中的一个,从而产生一些结果像这样:

SELECT SUM(post.views) AS sum_views, post.published AS post_published FROM post GROUP BY post.published

如果使用以下方法,则可能具有相同的效果(尽管演示方式不同):

Post.select("SUM(views), published").group(:published).as_json