Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

incompatible with sql_mode=only_full_group_by in mysql

So while upgrading a project from Rails 3.2 to Rails 4.2, somehow this query in one of my models which looks like:

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")

has started producing a mysql error as under:

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

I've looked at other answers of the similar questions, and I know I need to include a certain table's id column too in the GROUP BY clause but since my query is extremely complex, the options I've tried haven't been of much use. I am using gem mysql2 0.3.0 Suggestions ?

like image 237
Akash Srivastava Avatar asked Dec 28 '16 05:12

Akash Srivastava


People also ask

What is Only_full_group_by in MySQL?

If the ONLY_FULL_GROUP_BY SQL mode is enabled (which it is by default), MySQL rejects queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are neither named in the GROUP BY clause nor are functionally dependent on them.

What is sql_mode MySQL?

The most important ways for doing this are using SQL_MODE (controlled by the sql_mode system variable) and OLD_MODE (the old_mode system variable). SQL_MODE is used for getting MariaDB to emulate behavior from other SQL servers, while OLD_MODE is used for emulating behavior from older MariaDB or MySQL versions.


2 Answers

config/database.yml:

development: # Or test, or production, or all of them.
  ...
  variables:
    sql_mode: TRADITIONAL
like image 161
Pavel Avatar answered Sep 20 '22 22:09

Pavel


in your config/database.yml file:

default: &default
  variables:
    sql_mode: TRADITIONAL
like image 23
Jeremy Moritz Avatar answered Sep 21 '22 22:09

Jeremy Moritz