SELECT `user`.`id` AS `user_id`
, `user`.`name` AS `user_name`
, `class`.`id` AS `class_id`
, `class`.`user_id` AS `class_user_id`
, `class`.`name` AS `class_name`
, `class`.`teacher` AS `class_teacher`
, COUNT(`class`.`id`) AS count
FROM `user`
LEFT JOIN `class` ON `class`.`user_id`=`user`.`id`
GROUP BY `user`.`id`
having count >= 3;
위와 같은 쿼리를 실행했을 때, 아래와 같은 에러메시지 뜸
Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'class.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
번역
오류 코드: 1055. SELECT 목록의 표현식 #6은 GROUP BY 절에 없으며 GROUP BY 절의 열에 기능적으로 종속되지 않는 집계되지 않은 열 'class.id'를 포함합니다. 이는 sql_mode=only_full_group_by와 호환되지 않습니다.
GROUP BY 에 없는 컬럼은 SELECT 절에 쓸 수 없음.
왜냐면 보통 ONLY_FULL_GROUP_BY 옵션을 활성화해서 쓰기 때문이다.
이미 이렇게 짜서 쓰는 곳이라면
ONLY_FULL_GROUP_BY 옵션을 비활성화 하면 된다.
실제로 회사에서 이렇게 사용하고 있어서 옵션 비활성화 처리해서 쓰면 된다고 하셨다.
워크벤치에서 아래 명령어를 치면 ONLY_FULL_GROUP_BY 글자가 나온다.
select @@sql_mode;
해당 옵션을 제외하고 업데이트 치면 된다.
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
워크벤치에서만 적용되고, 워크벤치 재실행 뒤 치면 sql_mode가 되돌아가 있다. (ㅎㅎ 열받아)
DB의 설정을 직접 수정해야하는 방법으로 진행했다.
homebrew로 설치한 경우
vi /etc/my/cnf 파일에 들어가서 모드를 수정했다.
그 후에 맥북 재부팅 후 사용하니 잘 적용이 됐다.
mysql 공홈에서 다운받은 경우(https://dev.mysql.com/downloads/)
cd /usr/local/mysql/bin -- 폴더 이동
./mysql -u root -p -- mysql 접속 후 패스워드 입력
-- 아래 명령어 아무거나 쓰셈(저는 둘다 침 ㅋㅋㅋㅋ)
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
select @@sql_mode; -- 변경됐는지 확인
exit
이렇게 확인하고
mysql 재접속해서 변경된 거 유지됐는지 확인
mysql workbench 접속해서 변경 되었는지 크로스 체크하니까
다 바뀌어 있음
다시 개발하러 ㄱㄱ