SELECT 목록이 GROUP BY 절에 없으며 집계되지 않은 열 ......이(가) sql_mode=only_full_group_by와 호환되지 않습니다.
WAMP 서버를 탑재한 Windows PC에서 MySQL 5.7.13을 사용하는 AM
여기서 이 쿼리를 실행하는 동안 문제가 발생합니다.
SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
`status` = 'Active'
GROUP BY `proof_type`
항상 이렇게 에러가 납니다.
SELECT 목록의 식 #1은 GROUP BY 절에 없으며 GROUP BY 절의 열에 함수적으로 종속되지 않는 비집약 열 'returntr_tbl_customer_pod_pod.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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
이것.
SELECT 목록의 식 #1은 GROUP BY 절에 없으며 GROUP BY 절의 열에 함수적으로 종속되지 않는 비집약 열 'returntr_tbl_customer_pod_pod.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로 변경했습니다.
또는 SELECT 문에 의해 지정된 GROUP BY 절의 모든 열을 포함합니다.sql_mode는 활성화 상태로 둘 수 있습니다.
감사합니다... :-)
MySQL의 only_full_group_by SQL 규칙이 는 ANSI SQL 규칙이 ANSI SQL 사용 시 됩니다.GROUP BY내용에 , 은 만약 이 '만나면'을 하고 있습니다GROUP BYproof_type하다
proof_typecolumn- 다른 컬럼의 집약
''집계'를 말합니다. '는 '집계함수'를.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
의 대부분은 입니다.GROUP BYSO에 표시되는 질문은 엄밀한 모드가 해제되어 있기 때문에 쿼리는 실행 중이지만 잘못된 결과가 나타납니다.이 경우 쿼리가 전혀 실행되지 않아 실제로 무엇을 하고 싶은지 생각해야 합니다.
은 ": ANSI SQL"에서 가능한 합니다.GROUP BY또한 선택한 열에 따라 기능적으로 종속되는 열을 포함합니다.기능 의존성의 예로는 테이블의 프라이머리 키열에 의한 그룹화가 있습니다.프라이머리 키는 모든 레코드에 대해 일의임을 보증하기 때문에 다른 컬럼의 값도 결정됩니다.MySQL은 이를 허용하는 데이터베이스 중 하나입니다(SQL Server와 Oracle은 AFIK를 지원하지 않습니다).
MySql 엔진에는 시스템 변수가 있습니다.
Mysql 버전 5.7.5부터:ONLY_FULL_GROUP_BYSQL sql sql sql sql sql sql sql sql sql sql sql 。
버전 5.7.5 이전:ONLY_FULL_GROUP_BY는 디폴트로 유효하게 되어 있지 않습니다.
경우,ONLY_FULL_GROUP_BY5.7), 목록 SQL 5.7.5, MySQL의 합니다.HAVING "condition", 또는 "condition", "condition"ORDER BY는 목록에 .GROUP BY절은 기능적으로도 의존하지 않습니다.
문제를 해결하려면 다음 3가지 중 하나의 솔루션을 사용합니다.
(1) PHPMy Admin
무효화:ONLY_FULL_GROUP_BY 전환
phpMyAdmin을 사용하는 경우 아래 스크린샷에서 설명한 대로 설정을 변경합니다.
★★sql mode 및 를 지정합니다.ONLY_FULL_GROUP_BY에서
또는
(2) SQL/명령 프롬프트
무효화:ONLY_FULL_GROUP_BY다음 명령을 실행하여 모드를 변경하려면 다음 명령을 수행합니다.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
또는
(3)하지 말 (3)SELECT *
를 디세블로 하지 말아 주세요.ONLY_FULL_GROUP_BY butchern 단
의 합니다.SELECTquery. 열은 쿼리로 들어오는 합니다. 「 」, 「 」, 「 」group by 절 열(집약함수MAX,MIN,SUM,COUNTetc )
중요사항
를 point(1) OR point(2) 영속적으로 재기동할 대로 돌아옵니다.
설정 「」등)로가 있습니다./etc/mysql/my.cnf [mysqld]섹션)를 사용하여 MySQL 재시작 후에도 변경 내용이 그대로 적용됩니다.
구성 파일:/etc/mysql/my.cnf
변수 이름:sql_mode sql-mode
값에서 단어를 제거하고 파일을 저장합니다.
주의: 찾지 못한 경우sql_mode 두 줄 아래에 해 주세요.
[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
only_full_group_by = on은 MySQL 엔진에 다음과 같이 알립니다.적용 안 함GROUP BY어떤 결과를 보여줘야 할지 의심스러울 때 오류를 발생시킵니다.다음 경우에만 적용Group By 좋을지 , 즉, '어쩌면 좋을지'가 있을 때, '어쩌면 좋을지'가 있을 때.Group By★★★★★★★★★★★★★★★★★★★!
only_full_group_by = off가 MySQL 엔진에 알립니다. 항상 적용GROUP BY어떤 결과를 선택해야 할지 모르겠다면 무작위로 고르세요!
안 끄면 안 돼요.GROUP BY★★★★★★★★★★★★★★★★★★!
예:
표: 사용자
id | name
----------------
1 ali
2 john
3 ali
「 」를 사용하는 GROUP BY name§:
SELECT * FROM users GROUP BY name;
다음 두 가지 결과가 있을 수 있습니다.
1 ali
2 john
또는
2 john
3 ali
MYSQL!, 다르다, 다르니까.id 단, 둘 다 하하 s s s s s s 。name=ali.
해결책 1:
만 하다name 추가:
SELECT name FROM users GROUP BY name;
결과:
ali
john
열 GROUP BY 은 자기가 뭘 하고 있는지안다는 이에요.필요하지 않습니다.
필요한 경우 솔루션 3으로 이동합니다.
해결책 2:
★★only_full_group_byMYSQL은 두 가지 결과 중 하나를 랜덤으로 선택합니다!! (무엇을 신경 쓰지 않아도 상관없습니다.)id선택됩니다만, 향후 groupBys에서 예기치 않은 동작을 방지하기 위해 쿼리 직후에 반드시 유효하게 해 주세요.)
해결책 3
'어울리다'를 사용하세요.Aggregate 같은 기능을 하다MIN(),MAX()MYSQL이 무엇을 선택해야 하는지 결정하는 데 도움이 됩니다.
예를 들어 다음과 같습니다.
SELECT MAX(id), name FROM users GROUP BY name;
하다를 합니다.ali " " " " " " " 행:
2 john
3 ali
다음 방법으로 문제를 해결했습니다.
인우분투
★★★★★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 my my my my my 。
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';
Ubuntu의 경우
순서 1:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
2단계: 마지막 행으로 이동하여 다음 추가
sql_mode = ""
순서 3: 저장
스텝 4: mysql 서버를 재시작합니다.
모든 hi hi녕 、 hi녕 、 든 hi 、 든 hi 、 hi hi hi hi hi 。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`
SQL92에서 쿼리를 유효하게 하려면 이름 열을 선택 목록에서 생략하거나 GROUP BY 절에 이름을 지정해야 합니다.
SQL99 이후에서는 옵션 기능 T301에 따라 이러한 비집약이 GROUP BY 열에 종속된 경우 허용됩니다.이름과 고객 사이에 이러한 관계가 존재하는 경우 쿼리는 합법적입니다.예를 들어, 고객님의 주요 키가 고객님의 경우입니다.
MySQL 5.7.5 이상에서는 기능 의존성 검출을 구현합니다.SQL 모드가 ONLY_FULL_GROUP_BY(기본값)로 설정되어 있는 경우 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',''));
데이터베이스 재접속 잊지 마세요!!!
보기만 해도 여러 열/필드별로 그룹화하면 결과에 해가 되지 않을 것 같습니다.다음과 같이 그룹에 추가해 보십시오.
GROUP BY `proof_type`, `id`
은 「」에 그룹화 됩니다.proof_type, 그 다음에, 그 다음에id결과가 달라지지 않길 바랍니다.일부/대부분의 경우 여러 열을 기준으로 그룹화하면 잘못된 결과가 나타납니다.
저는 이 문제에 직면해 있었고 다음 질문으로는 충분하지 않았습니다.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
저장 프로시저를 사용하고 있었기 때문입니다.이 쿼리를 실행한 후 프로시저를 삭제하고 다시 작성해야 했습니다.
phpmyadmin으로 이동하여 콘솔을 열고 이 요청을 실행합니다.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
> sudo nano /etc/mysql/my.cnf
아래에 입력해 주세요.
[mysqld]
sql_mode = ""
Ctrl + O => Y = Ctrl + X
> sudo service mysql restart
두 가지 솔루션:
a) 사용
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode)',ONLY_FULL_GROUP_BY''만);
b) ANY_VALUE()를 사용하여 비집약 컬럼을 참조함으로써 ONLY_FULL_GROUP_BY를 비활성화하지 않고도 동일한 효과를 얻을 수 있습니다.
ANY_VALUE(값)
MySQL 8.0 업데이트
의 ★★★★★★★★★★★★★★★★★.sql-mode 갖지 않다NO_AUTO_CREATE_USER여기서 설명한 바와 같이 삭제되어 있습니다.-how-to-sql-mode-in-my-cnf-in-time 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/mysql/my.cnf위의 행을 추가합니다.
데이터베이스 크래시에도 비슷한 문제가 있었습니다.PHPStorm 데이터베이스 콘솔을 통해 DB의 파라미터를 다음과 같이 변경했습니다.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
지금은 매력적으로 일하고 있다
쿼리를 실행하기 전에 아래 쿼리를 실행합니다.
SET SQL_MODE = '';
PhpMyAdmin은 "SQL"을 사용합니다.ONLY_FULL_GROUP_BY방금 했는데 괜찮았어요.
제 경우 이전 sql_mode입니다.
sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
sql_mode를 확인할 수 있습니다.
show variables like "sql_mode";
그럼 이렇게 세팅할게요.
SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
- phpMyAdmin 로그인
- [ Server : localhost : 3306 ]으로 이동하여 데이터베이스를 선택하지 마십시오.
- 상단 메뉴에서 변수 클릭
- "sql 모드"를 검색하여 해당 값을 NO_ENGINE_SUBSTITION으로 편집합니다.
그게 다예요.
나는 이것을 Ec2에서 했고 그것은 매력적으로 작동했다.
여기 영속적으로 설정하는 정말 빠르고 쉬운 방법이 있습니다.
중인 NB:SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));는 일시적인 것으로, 서버를 재기동해도 에러가 발생합니다. , 다음의 을 실시합니다.
- root로 서버에 로그인합니다.
- 에서 " " " 를 실행합니다.
wget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh - 상태로 .
chmod +x disable-strict-mode.sh - 하려면 을 실행합니다.
./disable-strict-mode.sh
그리고 done, mysql이 변경되어 재시작됩니다.
GROUP_CONCAT()를 집계되지 않은 열에 추가할 수도 있습니다.
GROUP_CONCAT(your_column)
CentOS/RHEL(Linux 서버) 및 XAMPP를 로컬로 사용하는 경우
안녕하세요, 저는 매우 다른 해결책을 찾았고 이것이 도움이 되기를 바랍니다.(과잉으로 보일 수 있지만 다른 솔루션과 달리 이 방법은 정말 효과가 있었습니다.)
나는 Cent를 운영하고 있다.OS 7과 모든 코드가 로컬로 동작하고 있었습니다만, 서버에 업 로드했을 때에, 이 질문에 대응하는 에러가 표시되기 시작했습니다.
몇 시간 후 다른 각도에서 문제를 살펴보니 로컬 셋업이 XAMPP를 사용하고 있다는 것을 알고 MySQL 8을 사용하고 있다고 생각했습니다(MySQL 8은 서버에 설치되어 있습니다).
그러나 XAMPP에서 MySql에 로그인한 후 다음 출력을 받았습니다.
mysql -u root -p //Login
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 27
Server version: 10.4.18-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
네, 같은 것을 눈치챘을 수도 있습니다.XAMPP는 MariaDB를 사용하기 때문에 해결책은 mysql을 제거하고 Maria를 설치하는 것이었습니다.DB
Centos 7을 실행하고 있기 때문에, 이것을 실시하기 위한 순서는 다음과 같습니다.
- 서버에서 mysql 제거
# yum remove mysql mysql-server
- 시스템 업데이트(이것은 새로운 것을 설치할 때마다 공통)
# sudo yum -y update
- 저장소에 MariaDB 추가
# sudo tee /etc/yum.repos.d/MariaDB.repo<<EOF
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
- 캐시 업데이트
# sudo yum makecache fast
- 마리아 설치DB
# sudo yum -y install MariaDB-server MariaDB-client
- MariaDB를 스타트업에 추가합니다(시스템을 재부팅할 때마다 MariaDB를 기동합니다).
#sudo systemctl enable --now mariadb
그런 다음 다음 명령을 실행하여 설치를 보호할 수 있습니다.
# sudo mysql_secure_installation
이 마지막 명령어는 암호 및 기타 옵션을 설정할 수 있는 프로세스를 시작합니다.
그 후 root 이외의 사용자를 추가하고 필요한 권한을 부여하는 것을 잊지 마십시오.이는 어플리케이션에서 root 사용자를 사용할 수 없기 때문입니다(네, 나중에 알아봐야 했습니다).
루트 계정을 사용하여 처음 로그인:
# mysql -u root -p
그런 다음 사용자를 추가하고 권한을 부여합니다.
CREATE USER 'YourUserName'@localhost IDENTIFIED BY 'YourPassword';
GRANT ALL PRIVILEGES ON *.* TO 'YourUserName'@localhost IDENTIFIED BY 'YourPassword' WITH GRANT OPTION;
마지막으로 데이터베이스를 만들고 테이블/데이터/트리거/프로시저를 Import해야 합니다.
이제 로컬 설정과 마찬가지로 아무 문제 없이 코드를 실행할 수 있습니다.(로컬에서도 mysql 확장을 설치해야 하는 경우가 있습니다).
to to : :: /// : do any any any click any any any any any any any and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and : :///localhost/으 login login login login login login login login login login login login login login login login click click click click click click login login login login login login login login login login///// login login login맨 위 메뉴에서 SQL을 클릭하여 코드 아래에서 문제 해결서버에서 SQL 쿼리/쿼리를 실행합니다.SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Mac에서 MAMP를 사용하는 경우 MAMP를 재시작하면 MySQL 변수 변경이 모두 지워집니다.변경을 영속적으로 유지하려면 다음 절차를 따릅니다.
실행 중인 MAMP 서버를 정지합니다.
텍스트 편집기를 사용하여 my.cnf라는 파일을 생성하여 /Applications/MAMP/conf 폴더에 저장합니다.파일을 폴더의 루트에 배치합니다(많은 아파치 폴더가 포함되어 있기 때문에 조금 이상한 것 같습니다).다음 행을 파일에 추가합니다.
[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
파일을 저장하고 편집기를 닫습니다.MAMP 서버를 기동합니다.
그러면 변경이 영구적으로 됩니다.
WAMP 패널을 열고 MySQL 구성 파일을 엽니다.여기서 "sql_mode"를 검색하면 "그렇지 않으면 sql_mode="를 파일에 추가합니다.
MySQL 서버를 재시작하면 준비가 완료됩니다.
해피 코딩
고객님의 고객명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
언급URL : https://stackoverflow.com/questions/41887460/select-list-is-not-in-group-by-clause-and-contains-nonaggregated-column-inc
'source' 카테고리의 다른 글
| PHP에서 연결된 클라이언트의 MAC 및 IP 주소를 얻으려면 어떻게 해야 합니까? (0) | 2023.01.16 |
|---|---|
| 가장 일반적인 Python 문서 문자열 형식은 무엇입니까? (0) | 2023.01.16 |
| Vuetify에서 의 동적 자리 표시자 텍스트를 표시하는 방법은 무엇입니까? (0) | 2023.01.15 |
| printStackTrace()를 피하고 대신 로거 호출을 사용합니다. (0) | 2023.01.15 |
| Mariadb 컨테이너는 3310 대신 포트 3306을 여전히 구속하고 있습니다. (0) | 2023.01.15 |