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가 더 권장된다고 한다.
참고 블로그
'이럴땐 이렇게' 카테고리의 다른 글
JSON.parse한 Object 내 프로퍼티가 undefined로 나오는 경우 (0) | 2024.04.24 |
---|---|
java.lang.IllegalArgumentException: 이 쿠키를 위해, 유효하지 않은 도메인 ... (0) | 2023.11.07 |
java.rmi.server.ExportException: Port already in use: #### (0) | 2023.11.07 |
댓글()