- MySQL에서
ONLY_FULL_GROUP_BY
SQL 모드가 활성화되어 있을 때 발생하는 문제이다.- 이 모드는
GROUP BY
절에 포함되지 않은 비집계(non-aggregated) 컬럼을SELECT
문에서 사용하는 것을 허용하지 않는다. GROUP BY
에서 지정한 컬럼 이외의 컬럼을SELECT
리스트에 포함시킬 때, 해당 컬럼을 집계 함수로 감싸야한다.- (예:
SUM()
,AVG()
,COUNT()
등)
- (예:
- 이 모드는
해결 방법
1. GROUP BY
에 모든 비집계 컬럼 추가
가장 간단한 방법은 GROUP BY
절에 SELECT
에서 사용하는 모든 비집계 컬럼을 추가하는거다.
예를 들어, product.product_id
컬럼이 SELECT
목록에 있는데 GROUP BY
절에 포함되지 않은 경우,
GROUP BY
에 이 컬럼을 추가하면된다.
SELECT product.product_id, COUNT(*)
FROM product
GROUP BY product.product_id
2. 집계 함수 사용
비집계 컬럼에 대해 집계 함수를 사용하는 방법이다.
예를 들어, product.product_id
가 SELECT
리스트에 포함되지만 GROUP BY
에 없는 경우,
이를 집계 함수로 감싸는 방법이다.
SELECT MAX(product.product_id), COUNT(*)
FROM product
GROUP BY some_column;
3. ONLY_FULL_GROUP_BY
모드 비활성화
ONLY_FULL_GROUP_BY
모드를 비활성화하는 방법도 있지만, 이는 권장되지 않는 방법이라한다.
이 모드를 비활성화하면 SQL 쿼리가 제대로 동작하지 않거나 예기치 못한 결과를 초래할 수 있다고한다.
하지만 일시적으로 이 모드를 끄고 싶다면, 아래의 쿼리를 실행하면 된다.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
'DBMS > MySQL & MariaDB' 카테고리의 다른 글
MySQL 백업 및 복원 (0) | 2020.02.18 |
---|---|
MySQL 기본 명령어 (0) | 2019.03.05 |
MySQL 저장 엔진과 트랜잭션 처리 (2) (0) | 2017.11.06 |
MySQL 저장 엔진과 트랜잭션 처리 (1) (0) | 2017.11.02 |