ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'A' which is not functionally dependent on columns in GROUP BY clause;

이럴땐 이렇게|2023. 11. 29. 17:03

이번에 MySQL 버전을 업그레이드하면서 잘 되던 API가 작동하지 않는 이슈가 발생했다.

에러 로그를 보아하니... 문제가 발생한 쿼리는 아래와 같았다.

SELECT C.id, C.type
FROM PROJECT
   INNER JOIN GROUP B ON A.group_id = B.group_id
   INNER JOIN MEMBER C ON C.member_id = B.user_id
WHERE A.project_id = #{value}
GROUP BY C.id
ORDER BY A.reg_date DESC

 

그리고 에러 메시지는...

Cause: java.sql.SQLSyntaxErrorException: 
Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'A' 
which is not functionally dependent on columns in GROUP BY clause; 
this is incompatible with sql_mode=only_full_group_by

 

ORDER BY에 있는건 GROUP BY에도 들어가야 한단다.

전에는 이런 게 없었는데? 아무튼 권장하는 방식은 아닌 것 같으니 바꿔본다.

 

그래서 GROUP BY를 제거하고 DISTINCT로 대체했다.

SELECT DISTINCT C.id, C.type
FROM PROJECT
   INNER JOIN GROUP B ON A.group_id = B.group_id
   INNER JOIN MEMBER C ON C.member_id = B.user_id
WHERE A.project_id = #{value}
ORDER BY A.reg_date DESC

 

그랬더니 이제는 ORDER BY에 있는 게 SELECT 리스트에도 들어가야 한단다.

ORDER BY clause is not in SELECT list, 
references column 'C' which is not in SELECT list; 
this is incompatible with DISTINCT

 

어차피 불러온 데이터를 사용하지만 않으면 되니 크게 이슈될 건 없지만,..

MySQL 5.8 이상부터는 성능 이슈로 인해 SELECT에 포함되지 않은 컬럼으로 정렬할 수 없게 제한됐다.

이 옵션이 sql_mode = 'only_full_group_by' 인데, 이 옵션을 꺼두면 위와 같은 경고는 뜨지 않게 된다.

 

이번 일로 찾아본 바로는,

GROUP BY보다는 DISTINCT가 효율 면에서 차이는 크지 않지만

단순 중복제거를 위함이고 집계함수를 사용할 게 아니라면 가독성 면에서 DISTINCT가 더 권장된다고 한다.

 

 

참고 블로그

DISTINCT, GROUP BY 무엇을 쓸까

ORDER BY clause is not in SELECT list

댓글()