programing

SQLSTATE [ 42000 ]:구문 오류 또는 액세스 위반: SELECT 목록의 1055 식 #3이 GROUP BY 절에 없고 집계되지 않은 것을 포함합니다.

bestcode 2022. 11. 17. 21:12
반응형

SQLSTATE [ 42000 ]:구문 오류 또는 액세스 위반: SELECT 목록의 1055 식 #3이 GROUP BY 절에 없고 집계되지 않은 것을 포함합니다.

15.10에서 16.04로 업그레이드 된 우분투는 yii2 프로젝트에 이 erro가 있습니다.

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #3
of SELECT list is not in GROUP BY clause and contains nonaggregated column 
'iicityYii.opportunity_conditions.money' which is not functionally dependent 
on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

실행 중인 SQL은 다음과 같습니다.

SELECT SUM(oc.money),op.id,oc.money,
            op.mantaghe,
            op.`time`, op.`id`, `op`.`logo`,
           `pd`.`user_id`, `op`.`name`, 
           `pd`.`co_name`, `op`.`address`, 
           `op`.`project_type_id`, `op`.`state_id`
FROM `opportunity` op 
INNER JOIN `profile_details` pd  ON op.user_id=pd.user_id  
INNER JOIN `opportunity_conditions` oc ON   op.id=oc.opportunity_id
GROUP BY `op`.`id`
ORDER BY `op`.`id` DESC

내 문제를 어떻게 해결하나요?

실행:

sudo mysql -u root -p
mysql> SELECT @@global.sql_mode;

(선택사항으로 나중에 원래 설정으로 되돌리려면 출력을 노트에 복사하십시오.)

MySQL Server 인스턴스의 SQL 모드를 변경합니다.

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

('돌아가다')와 같은 것을 할 수 mysql> SET GLOBAL sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';을 참조해 주십시오.)


보다 영속적인 방법(MySQL 재시작 후에도 유지됨)은 MySQL 구성을 사용하는 것입니다.★★★★★★★★★★★★★★★로 이동/etc/mysql/my.cnf 할 도 있습니다).sudo vim /etc/mysql/mysql.conf.d/mysql.cnf

  • 「 」의을 추가합니다.[mysqld]에 '아까워서'라는 .sql_mode = "" 거 있잖아요sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION".

  • MySQL 서비스를 다시 시작합니다.

     sudo systemctl restart mysql
    

(오류)sudo service mysql restart)

https://dba.stackexchange.com/a/113153/18098 도 참조해 주세요.

MySql에서 파일 구성/데이터베이스로 이동합니다.php는 어레이 MySql 모드에서 false로 변경됩니다.

'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => false, //from true
        'engine' => null,
    ],
],

이 라인을 복사해서 실행해 주세요.그것은 나에게 효과가 있었다.

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

이것을 수정하기 위한 유튜브 동영상

이 솔루션은 MySQL 구성 파일을 편집하는 것입니다.재시작할 때마다 구성이 복구되기 때문입니다.

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

추가하다

[mysqld]
sql-mode=""

재기동

sudo systemctl restart mysql

ubuntu 18.04로 동작합니다.

select에서 sum이라는 이름의 집계 함수와 일련의 열 이름이 있는 경우, 오류는 그룹별 절에서 올바른 열 이름 목록을 지정하지 않았음을 나타냅니다.아마도 에 의해 그룹에 더 많은 열 이름을 추가해야 할 수 있습니다.profile_details, opportunity_conditions

,도,,(opportunity.id),(opportunity_conditions.money), (opportunity.mantaghe), ??().

sum(opportunity.id), sum(opportunity_conditions.money),

sum(고정성.스파게티),

그렇지 않으면 이 컬럼이 일반 컬럼일 경우 () 없이 일반 구문을 사용해야 합니다.

opportunity.id, opportunity_conditions.money,opportunity.mantaghe,

가능한 쿼리를 다시 작성하려고 했습니다.

 SELECT SUM(opportunity_conditions.money),
        `opportunity`.`id`,
        `opportunity_conditions.money`,
        `opportunity.mantaghe`, 
        `opportunity`.`time`, 
        `opportunity`.`logo`, 
        `profile_details`.`user_id`,
        `opportunity`.`name`, 
        `profile_details`.`co_name`,
        `opportunity`.`address`, 
        `opportunity`.`project_type_id`,
        `opportunity`.`state_id` 
FROM `opportunity` 
INNER JOIN `profile_details` ON `opportunity`.`user_id`= `profile_details`.`user_id` 7
INNER JOIN `opportunity_conditions` ON `opportunity`.`id`=`opportunity_conditions`.`opportunity_id` 
GROUP BY`opportunity`.`id`,   `profile_details`.`user_id`,`opportunity_conditions.money`,  
ORDER BY `opportunity`.`id` DESC

기본 열 이름에 그룹별로 표시(기대)

GROUP BY`opportunity`.`id`,   `profile_details`.`user_id`,`opportunity_conditions.money`,  

단순히 following을 엄격하게 false로 설정합니다.

Config > database.php  set 'strict' => false,

CentOS8에서는 webmin 설정 파일 /etc/my.cnf.d/mysql-server.cnf를 사용합니다.

[mysqld] sql-mode="

쿼리를 다음 주소로 업데이트하는 것이 좋습니다.

    SELECT SUM(any_value(oc.money)),op.id,any_value(oc.money) as money,
            op.mantaghe,
            op.`time`, op.`id`, `op`.`logo`,
           any_value(`pd`.`user_id`) as user_id, `op`.`name`, 
           any_value(`pd`.`co_name`) as co_name, `op`.`address`, 
           `op`.`project_type_id`, `op`.`state_id`
FROM `opportunity` op 
INNER JOIN `profile_details` pd  ON op.user_id=pd.user_id  
INNER JOIN `opportunity_conditions` oc ON   op.id=oc.opportunity_id
GROUP BY `op`.`id`
ORDER BY `op`.`id` DESC

★★
에 '하다'가 포함되어 있는 group by 않은 에는 '컬럼'을 .any_value()다른 테이블의 열을 호출하는 함수입니다.

개인적으로 sql_mode 글로벌 변수를 업데이트하지 않으려고 합니다.

자세한 것은, https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html 를 참조해 주세요.

한 층 한 덩어리로

SQLSTATE [ 42000 ]:구문 오류 또는 액세스 위반: SELECT 목록의 1055 식 #1이 GROUP BY 절에 없고 GROUP BY 절의 열에 함수적으로 종속되지 않는 비집약 열 'turn.barnamehs.id'을 포함합니다. 이는 sql_mode=only_full_group_by select * from *와 호환되지 않습니다.tables여기서 date(날짜)end_date) > = 2022-05-10 00:00:00 그룹화speciality_id

해결책: config/module에서 'false' = > false를 변경합니다.php

Thx, 이것은 도움이 되었습니다만, 이것에 의해 영구적으로 설정되는 것은 아니고, 재기동할 때마다 원래대로 돌아옵니다.

따라서 MySQL 재시작 후에도 변경 내용이 그대로 적용되도록 구성 파일(예: [mysql] 섹션의 /etc/mysql/my.cnf)에서 설정해야 합니다.

설정 파일: /etc/mysql/my.cnf

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

사용할 수 있습니다.ANY_VALUE참조할 수 있습니다.따라서 다음과 같은 이점이 있습니다.

SELECT SUM(oc.money),
       op.id,
       ANY_VALUE(oc.money),
       ANY_VALUE(op.mantaghe),
       ANY_VALUE(op.`time`), op.`id`, ANY_VALUE(`op`.`logo`),
       ANY_VALUE(`pd`.`user_id`), ANY_VALUE(`op`.`name`), 
       ANY_VALUE(`pd`.`co_name`), ANY_VALUE(`op`.`address`), 
       ANY_VALUE(`op`.`project_type_id`), ANY_VALUE(`op`.`state_id`)
FROM `opportunity` op 
INNER JOIN `profile_details` pd  ON op.user_id=pd.user_id  
INNER JOIN `opportunity_conditions` oc ON   op.id=oc.opportunity_id
GROUP BY `op`.`id`
ORDER BY `op`.`id` DESC

자세한 것은 이쪽.

언급URL : https://stackoverflow.com/questions/36950857/sqlstate42000-syntax-error-or-access-violation-1055-expression-3-of-select

반응형