SELECT 목록이 GROUP BY 절에없고 집계되지 않은 열이 포함되어 있습니다. sql_mode = only_full_group_by와 호환되지 않습니다.


134

WAMP Server가 설치된 Windows PC에서 MySQL 5.7.13을 사용하는 오전

여기 내 문제는이 쿼리를 실행하는 동안입니다.

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

항상 이와 같은 오류가 발생합니다.

SELECT 목록의 식 # 1이 GROUP BY 절에없고 GROUP BY 절의 열에 기능적으로 종속되지 않는 집계되지 않은 열 'returntr_prod.tbl_customer_pod_uploads.id'를 포함합니다. 이것은 sql_mode = only_full_group_by와 호환되지 않습니다.

최선의 해결책을 말씀해 주시겠습니까?

결과가 필요합니다.

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name    | is_private | status | createdon           | updatedon           |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
|  1 |       1 | 78      | 1       | 21.1212  | 21.5454   |          1 |             1 | id_Card.docx |          0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

12
사용하지 마십시오 SELECT *.
shmosel


SELECT id FROM tbl_customer_pod_uploadsWHERE load_id= ' statusproof_type
78'AND

2
이전 쿼리에 대한 호환성을 원하면 only_full_group_bySQL 모드를 끌 수 있습니다 .
Barmar

5
ANY_VALUE (proof_type)를 사용하여보십시오 : dev.mysql.com/doc/refman/5.7/en/group-by-handling.html SELECT * FROM, ANY_VALUE (proof_type) = '78'AND = '활성'GROUP BY를tbl_customer_pod_uploadsload_idstatusproof_type
AlexGach을

답변:


253

SELECT 목록의 식 # 1이 GROUP BY 절에없고 GROUP BY 절의 열에 기능적으로 종속되지 않는 집계되지 않은 열 'returntr_prod.tbl_customer_pod_uploads.id'를 포함합니다. 이것은 sql_mode = only_full_group_by와 호환되지 않습니다.

이 명령으로 MySQL에서 SQL 모드를 변경하면 간단히 해결할 수 있습니다.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

이것도 나를 위해 작동합니다 .. 내 프로젝트에는 이와 같은 쿼리가 많기 때문에이 SQL 모드를 only_full_group_by로 변경했기 때문에 이것을 사용했습니다.

감사합니다... :-)


14
그것은 나를 위해 작동합니다!. 당신은 내 하루를 구합니다. RESTART MYSQL 서비스에 대한 기억
marcode_ely

2
codeigniter를 사용하고 있고 모델에서 실행하고 싶다면 어떻게 사용합니까? 나를 도와 줄 수 있니 ? @marcode_ely
DhavalThakor

@DhavalThakor, 서버에서이 쿼리를 실행하면 반복해서 실행할 필요가 없습니다. 당신 때문에 필요는 모델에 넣어 없습니다
Dhanu K

2
MySQL 5.7.29, 서비스를 다시 시작할 필요가 없음
Taavi

나는 서버 버전을 사용하고 있습니다 : 5.7.31-0ubuntu0.16.04.1-(Ubuntu) 그리고 내 컴퓨터를 시작할 때마다 매번 설정합니다. 이에 대한 영구적 인 수정이 있습니까?
Arpita Hunka

76

MySQL의 only_full_group_by모드가 켜져 있으면 .NET Framework를 사용할 때 엄격한 ANSI SQL 규칙이 적용됩니다 GROUP BY. 당신이 경우 쿼리에 관해서는,이 수단는 것을 GROUP BYproof_type열, 당신은 두 가지를 선택할 수 있습니다 :

  • proof_type열 또는
  • 다른 열의 집계


다른 컬럼의 "집계", 나는 같은 집계 함수를 사용하여 의미 MIN(), MAX()또는 AVG()다른 열이. 따라서 귀하의 경우 다음 쿼리가 유효합니다.

SELECT proof_type,
       MAX(id) AS max_id,
       MAX(some_col),
       MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
      status = 'Active'
GROUP BY proof_type

대부분의 MySQL GROUP BY내가 보는 질문은 엄격 모드가 꺼져 있으므로 쿼리가 실행되지만 잘못된 결과가 나타납니다. 귀하의 경우 쿼리가 전혀 실행되지 않으므로 실제로 수행하려는 작업에 대해 생각해야합니다.

참고 : ANSI SQL은 선택되는 GROUP BY열에 기능적으로 종속 된 열을 포함하여 선택이 허용되는 항목을 확장합니다 . 기능적 종속성의 예는 테이블의 기본 키 열을 기준으로 그룹화하는 것입니다. 기본 키는 모든 레코드에 대해 고유함이 보장되므로 다른 열의 값도 결정됩니다. MySQL은이를 허용하는 데이터베이스 중 하나입니다 (SQL Server 및 Oracle은 AFAIK가 아님).


2
단 한 가지 참고 : 결과는 정확하지 않지만 (MySQL 규칙을 따름) 예측할 수 없습니다. 즉, 그룹 기준에 속하지 않고 집계되지 않은 (기능적으로 종속되지 않은) 열은 해당 그룹에서 '무작위'값을 반환합니다. 매뉴얼에 따르면 "서버는 각 그룹에서 값을 자유롭게 선택할 수 있습니다."
Pred

엄격한 그룹화를 위반한다고해서 반드시 잘못된 결과가 생성되는 것은 아닙니다 . 일반적으로 필드가 동일하다는 것이 보장 될 때 수행합니다 (예 : 일대 다 조인). 그리고 보장되지 않더라도 임의의 행을 선택하는 것이 집계 함수를 사용하거나 그룹화 수준을 추가하는 것보다 더 이상 올바르지 않은 경우가 많습니다.
shmosel

1
나를 위해 +1. 위의 "수락 된"답변이 왜 수락되었는지 모르겠습니다. 귀하의 방식은 올바른 방식이며 허용되는 답변은 향후 더 많은 문제로 이어질 일반적인 해키 수정입니다.
Jcov

1
@Jcov ... 그리고 나는 당신의 댓글에 더 이상 동의하지 않았습니다. ANSI 제한을 끄는 GROUP BY것은 거의 항상 나쁜 생각입니다. 너무 많은 사용자가 잘못된 조언을 받아 사용하고 있다는 사실이 무섭습니다.
Tim Biegeleisen

1
@TimBiegeleisen 현대 복사 + 붙여 넣기 개발에 오신 것을 환영합니다. "신뢰할 수없는 출처에서 어딘가에서 임의의 것을 읽은 사람이 이미 저를 위해 생각을했다고 생각할 필요가 없습니다."
Jcov

45

하나의 솔루션 사용

(1) PHPMyAdmin

phpMyAdmin을 사용하는 경우 아래 스크린 샷에 언급 된대로 " sql_mode "설정 을 변경합니다 . 여기에 이미지 설명 입력

"sql 모드"변수를 편집하고 값에서 "ONLY_FULL_GROUP_BY"텍스트를 제거하십시오.

(2) SQL / 명령 프롬프트 아래 명령을 실행합니다.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

(삼) SELECT *를 사용하지 마십시오.

SELECT 쿼리에서 관련 열을 사용하십시오. 관련이란 "group by"절 또는 집계 함수 (MAX, MIN, SUM, COUNT 등)가있는 열에 나오는 열을 의미합니다.


중요 사항

point (1) 또는 point (2)를 사용하여 변경 한 내용은 영구적으로 설정되지 않으며 다시 시작할 때마다 되돌아갑니다.

따라서 구성 파일 (예 : [mysqld] 섹션의 /etc/mysql/my.cnf)에서이를 설정해야 MySQL을 다시 시작한 후에도 변경 사항이 적용됩니다.

구성 파일 : /etc/mysql/my.cnf

변수 이름 : sql_mode 또는 sql-mode


위의 답변에 감사드립니다. my.cnf에서 말한대로 이것을 변경하고 싶습니다. 그러나 해당 파일을 열면 읽기 전용 모드로만 열립니다. 어떤 도움이나 참조 링크 ???. 저는 Ubuntu 16.04를 사용합니다
Sanmitha Sadhishkumar

1
(1) "chmod"명령을 사용하여 my.cnf 파일의 파일 권한을 변경합니다. (2) my.cnf에서 변경을 수행합니다. (3) 다시 읽기 전용으로 설정합니다 ( "chmod"를 사용하여 파일 권한을 다시 변경). (4) mysql을 다시 시작합니다
Rakesh Soni

21

아래 방법은 내 문제를 해결했습니다.

우분투에서

유형: sudo vi /etc/mysql/my.cnf

A를 입력하여 삽입 모드로 들어갑니다.

마지막 줄에 두 줄 코드 아래에 붙여 넣습니다.

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

esc를 입력하여 입력 모드를 종료합니다.

Type :wq to save and close vim.

sudo service mysql restartMySQL을 다시 시작하려면 입력하십시오 .


1
감사합니다! in cent os, whm, my.cnf는 sudo vi /etc/my.cnf
Reejesh PK

19

일부 명령으로 sql_mode = only_full_group_by 를 비활성화 할 수 있습니다. 터미널 또는 MySql IDE에서 시도 할 수 있습니다.

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

11

우분투에서

1 단계:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

2 단계 : 마지막 줄로 이동하여 다음을 추가합니다.

sql_mode = ""

3 단계 : 저장

4 단계 : mysql 서버를 다시 시작합니다.


9

쿼리가 SQL92에서 유효하려면 이름 열이 선택 목록에서 생략되거나 GROUP BY 절에서 이름이 지정되어야합니다.

SQL99 이상에서는 기능적으로 GROUP BY 열에 종속 된 경우 선택적 기능 T301 당 이러한 비 집계를 허용합니다. 이름과 custid간에 이러한 관계가 존재하는 경우 쿼리가 합법적입니다. 예를 들어, 고객의 기본 키로 관리 된 경우입니다.

MySQL 5.7.5 이상은 기능 의존성 감지를 구현합니다. ONLY_FULL_GROUP_BY SQL 모드가 활성화 된 경우 (기본값) MySQL은 선택 목록, HAVING 조건 또는 ORDER BY 목록이 GROUP BY 절에 이름이 지정되지 않았거나 기능적으로 종속되지 않은 집계되지 않은 열을 참조하는 쿼리를 거부합니다. .

MySQL을 통해 :: MySQL 5.7 참조 ​​설명서 :: 12.19.3 GROUP BY의 MySQL 처리

다음 명령으로 SQL 모드를 변경하여 해결할 수 있습니다.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

그리고 ... 데이터베이스를 다시 연결하는 것을 잊지 마십시오 !!!


5

phpmyadmin으로 이동하여 콘솔을 열고이 요청을 실행하십시오.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

4

안녕하세요 모든 컬럼을 사용하는 대신 필요한 것을 사용하여 ANY_VALUE(column_name) . 완벽하게 작동합니다. 그냥 확인하세요.

예 :

SELECT proof_type,any_value("customer_name") as customer_name
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`

3

PhpMyAdmin을 사용하는 경우 "SQL 모드"를 검색하고 값을 제거하십시오. ONLY_FULL_GROUP_BY, 방금 수행했으며 괜찮습니다.


3
> sudo nano /etc/mysql/my.cnf

아래에 입력

[mysqld]
sql_mode = ""

Ctrl + O => Y = Ctrl + X

> sudo service mysql restart

2

외관상 여러 열 / 필드로 그룹화 하면 결과가 손상되지 않을 것이라고 생각 합니다. 다음과 같이 그룹에 추가해보세요.

GROUP BY `proof_type`, `id`

이것은 proof_type먼저 그룹화됩니다 id. 이것이 결과를 바꾸지 않기를 바랍니다. 일부 / 대부분의 경우 여러 열로 그룹화하면 잘못된 결과가 제공됩니다.


1
  1. phpMyAdmin에 로그인
  2. 서버 : localhost : 3306으로 이동하고 데이터베이스를 선택하지 마십시오.
  3. 상단 메뉴에서 변수를 클릭하십시오.
  4. "sql 모드"를 검색하고 해당 값을 NO_ENGINE_SUBSTITUTION으로 편집하십시오.

그게 다야.

나는 Ec2에서 이것을했고 그것은 매력처럼 작동했습니다.


1

영구적으로 설정하는 정말 빠르고 쉬운 방법입니다.

주의 : 실행 SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 은 일시적이며 서버를 다시 시작할 때 여전히 오류가 발생합니다. 이 문제를 영구적으로 해결하려면 다음을 수행하십시오.

  1. 서버에 루트로 로그인하십시오.
  2. 터미널에서 실행 wget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh
  3. 다음을 실행하여 스크립트를 실행 가능하게 만드십시오. chmod +x disable-strict-mode.sh
  4. 실행하여 스크립트 실행 ./disable-strict-mode.sh

그리고 완료되면 mysql에 변경 사항이 적용되고 다시 시작됩니다.


0

MySQL 8.0 업데이트

당신은 sql-mode필요가 없습니다 NO_AUTO_CREATE_USER여기에 언급 한 바와 같이이 제거 된 것처럼 - 방법 - 투 - 설정-SQL 모드 -에 - 내 - CNF-에서-mysql을-8

[mysqld]
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

또한 누군가 my.cnf파일 이 없으면 새 파일을 만든 다음 /etc/my.cnf위의 줄을 추가합니다.


0

데이터베이스 분쇄의 일부와 비슷한 문제가 발생했습니다. 내가 한 일은 다음과 같이 PHPStorm 데이터베이스 콘솔을 통해 DB의 매개 변수를 변경 한 것입니다.

   SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

이제 매력처럼 작동


-2

에서 다음 my.ini을 작성하십시오.

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

버전에 따라 다릅니다. 또는:

[mysqld]
sql_mode = ""

또는 간단히 제거하십시오. ONLY_FULL_GROUP_BY


-2

WAMP 패널을 열고 MySQL 구성 파일을 엽니 다. "sql_mode"를 찾으면 ""로 설정하고 찾지 못하면 sql_mode = ""를 파일에 추가합니다.

MySQL 서버를 다시 시작하면 좋습니다.

행복한 코딩.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.