
위와 같은 테이블에서 유저별로 최신 피드백을 찾기 위해 쿼리를 짜던 중
mysql> SELECT *, MAX(feedback_date) FROM lol_feedbacks GROUP BY user_name;
이렇게 쿼리를 짜서 해결하려 했으나
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.lol_feedbacks.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
이런 에러가 발생하였다.
찾아보니 MySQL 버전업과 함께 SQL 문법이 엄격해져 에러가 발생하였다.
this is incompatible with sql_mode=only_full_group_by
sql_mode 중 only_full_group_by에 맞지 않는 쿼리라고 한다.
sql_mode only_full_group_by
[공식 문서 정의]
해당 옵션이 활성화되어있을 경우
MySQL은 선택 목록, 조건 또는 목록이 절에 명명되지 않았거나 기능적으로 종속되지 않은 비집계 열을 참조하는 쿼리 를 HAVING거부한다.
즉, mysql이 지정한 group by 표준 규칙에 맞게 쿼리를 수정하라는 뜻이다.
해결 방법
1. Query 수정
mysql> SELECT user_name, MAX(feedback_date) FROM lol_feedbacks GROUP BY user_name;
// user_name과 feedback_date의 최댓값만 SELECT
mysql> SELECT user_name, ANY_VALUE(id) AS id, ANY_VALUE(satisfaction_score) as satisfaction_score, MAX(feedback_date) FROM lol_feedbacks GROUP BY user_name;
// 어떠한 값이 와도 상관이 없다면 ANY_VALUE를 이용해 SELECT
mysql> SELECT *, MAX(feedback_date) FROM lol_feedbacks GROUP BY user_name, id, satisfaction_score, feedback_date;
// 다른 컬럼을 GROUP BY에 추가