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 ?
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.
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.
config/database.yml
:
development: # Or test, or production, or all of them.
...
variables:
sql_mode: TRADITIONAL
in your config/database.yml
file:
default: &default
variables:
sql_mode: TRADITIONAL
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With