[MySQL] only_full_group_by 에러 해결

김민범·2024년 9월 20일

DB

목록 보기
4/12


위와 같은 테이블에서 유저별로 최신 피드백을 찾기 위해 쿼리를 짜던 중

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 수정

  • GROUP BY를 사용할 경우 GROUP BY에 나열된 컬럼, 집계함수 만 SELECT 가능하다
  • 현재 쿼리에서는 *을 사용해 모든 컬럼을 SELECT 했기 때문에 에러 발생
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에 추가
  1. sql_mode 에서 only_full_group_by 비활성화
  • 공식 문서에서도 비활성화가 해결방법으로 제시됨

0개의 댓글