GROUP BY 함수를 쓰는데 처음보는 에러가 떠서 찾아보다가 잘 정리된 글이 있어서 업로드
Expression #2 of SELECT list is not in GROUP BY clause and contains
nonaggregated column '컬럼명' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
위에 링크에선 3가지 방법을 설명해준다
✏️ 에러 해결 방법
해당 에러를 해결하기 위해서는 두가지의 해결 방법이 있다.
1. Query 수정
SELECT
o.custid
, c.name
, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;
위 예시는GROUP BY로o.custid를 그룹화하여 SELECT하는 쿼리이다. 이렇게 작성하면 위의 에러가 나올 것이다.
뭐가 잘못된 걸까?
GROUP BY를 사용할 경우,SELECT할 수 있는 컬럼은
GROUP BY에 나열된 컬럼 (여기서는o.custid)
COUNT(), AVG(), SUM()과 같은 집계함수
위의 두가지 경우에만 사용할 수 있다.
그렇다면 다시 위의 쿼리로 돌아갔을 때 잘못된 점이 보일 것이다.
GROUP BY에 선언되지 않은 컬럼, 집계함수도 아닌 컬럼인c.name으로 인해 문제가 발생한 것이다.
문제를 해결하기 위해서는
해결1. 아래와 같이 비집계 컬럼인 c.name을GROUP BY에 추가
SELECT
o.custid
, c.name
, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
//GROUP BY o.custid
GROUP BY o.custid, c.name
해결2. 어떠한 값이 와도 상관이 없다면 ANY_VALUE() 함수 사용
SELECT
o.custid
, ANY_VALUE(c.name)
, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid
2.sql_mode옵션 중only_full_group_by비활성화
실제로 해결방법으로 공식문서에도 비활성화하라고 나와있다.
여기까지 MySQL 공식문서에 나와있는 GROUP BY 규칙이었다.
나 같은 경우 기본적으로 세팅되어있는 sql_mode 옵션을 건드릴 수 없으니 2번 방식은 선택하지 못했고
해결1 방식으로 했었는데
해결2 방식을 이번에 알게되서 다시 보기 위해 포스팅 상황에 맞게 선택해서 작업하면 될 것 같다