【问题标题】:incompatible with sql_mode=only_full_group_by in mysql与 mysql 中的 sql_mode=only_full_group_by 不兼容
【发布时间】:2017-05-12 08:35:41
【问题描述】:

因此,在将项目从 Rails 3.2 升级到 Rails 4.2 时,不知何故,我的一个模型中的这个查询看起来像:

rows = ActiveRecord::Base.connection.execute("Select q.id,q.times_taken,avg(qr.correct)*100,q.difficulty,q.weight,sk.name,sa.name,sub.name,q.tag_list from 
  (select qu.id,qu.times_taken,qu.difficulty,qu.weight,group_concat(tags.name) tag_list,qu.subject_id,qu.subject_area_id
    from questions qu left join taggings t on (qu.id = taggable_id) left join tags on (t.tag_id = tags.id) 
    where qu.id in (#{@questions_out_ids.join(',')}) and t.taggable_type='Question' group by t.taggable_id) q
  left join subjects sub on (q.subject_id = sub.id) left join subject_areas sa on (q.subject_area_id = sa.id) 
  left join skills_subject_areas ssa on (sa.id = ssa.subject_area_id) left join skills sk on (ssa.skill_id = sk.id), 
  archived_question_results qr,attempts a where  qr.question_id = q.id and a.id = qr.attempt_id and a.is_normalized = 1 
  and a.state = 'complete' group by qr.question_id order by q.id")

已开始产生以下 mysql 错误:

ERROR 1055 (42000): Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'faces_development.sk.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

我查看了类似问题的其他答案,并且我知道我还需要在 GROUP BY 子句中包含某个表的 id 列,但由于我的查询非常复杂,所以我尝试过的选项没有多大用处。我正在使用 gem mysql2 0.3.0 建议?

【问题讨论】:

标签: mysql ruby-on-rails


【解决方案1】:

我想我找到了解决问题的方法,显然是外部select 中的6th 表达式,即sk.name 产生了问题。将相同的表达式添加到外部 group by 子句为我修复了它。

rows = ActiveRecord::Base.connection.execute("select q.id,q.times_taken,avg(qr.correct)*100,q.difficulty,q.weight,sk.name,sa.name,sub.name,q.tag_list from 
  (select qu.id,qu.times_taken,qu.difficulty,qu.weight,group_concat(tags.name) tag_list,qu.subject_id,qu.subject_area_id
    from questions qu left join taggings t on (qu.id = taggable_id) left join tags on (t.tag_id = tags.id) 
    where qu.id in (#{@questions_out_ids.join(',')}) and t.taggable_type='Question' group by t.taggable_id) q
  left join subjects sub on (q.subject_id = sub.id) left join subject_areas sa on (q.subject_area_id = sa.id) 
  left join skills_subject_areas ssa on (sa.id = ssa.subject_area_id) left join skills sk on (ssa.skill_id = sk.id), 
  archived_question_results qr,attempts a where  qr.question_id = q.id and a.id = qr.attempt_id and a.is_normalized = 1 
  and a.state = 'complete' group by sk.name, qr.question_id order by q.id")

【讨论】:

    【解决方案2】:

    config/database.yml:

    development: # Or test, or production, or all of them.
      ...
      variables:
        sql_mode: TRADITIONAL
    

    【讨论】:

    • 完美运行!!
    • 这似乎在您重新启动应用程序时应用该规则 - 它不需要您重新创建或迁移数据库或任何东西,这很好。
    【解决方案3】:

    在您的config/database.yml 文件中:

    default: &default
      variables:
        sql_mode: TRADITIONAL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2018-04-13
      • 2016-07-12
      相关资源
      最近更新 更多