복붙노트

[SQL] 오류 MySQL의에 쿼리를 실행할 때 ONLY_FULL_GROUP_BY 관련

SQL

오류 MySQL의에 쿼리를 실행할 때 ONLY_FULL_GROUP_BY 관련

나는 내 시스템을 업그레이드 한 내가 일하고 웹 응용 프로그램 PHP와 MySQL의 5.7.9을 설치했습니다. 동적으로 생성되는 쿼리가 있고, MySQL의 이전 버전에서 실행할 때 그것을 잘 작동합니다. 5.7로 업그레이드하기 때문에 나는이 오류가 발생합니다 :

서버 SQL 모드의 주제에서 MySQL 5.7에 대한 매뉴얼 페이지를 참고.

이 날 문제를주고있다 쿼리입니다 :

SELECT mod_users_groups.group_id AS 'value', 
       group_name AS 'text' 
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id 
WHERE  mod_users_groups.active = 1 
  AND mod_users_groups.department_id = 1 
  AND mod_users_groups.manage_work_orders = 1 
  AND group_name != 'root' 
  AND group_name != 'superuser' 
GROUP BY group_name 
HAVING COUNT(`user_id`) > 0 
ORDER BY group_name

나는 어떤 문제에 대해 인터넷 검색을했다,하지만 난 쿼리를 해결하기 위해해야 ​​할 일을 파악하기에 충분한 ONLY_FULL_GROUP_BY 이해하지 않습니다. 난 그냥 ONLY_FULL_GROUP_BY 옵션을 끄거나 내가해야 할 다른 사람이 뭔가 할 수 있습니까?

좀 더 자세한 정보가 필요하면 알려주세요.

해결법

  1. ==============================

    1.난 그냥 GROUP BY에 GROUP_ID 추가합니다.

    난 그냥 GROUP BY에 GROUP_ID 추가합니다.

    에 의해 그룹의 일부가 아닌 열을 선택하면 그룹 내에서 해당 열의 여러 값이있을 수 있지만 결과에서 하나의 값 공간이 될 것입니다. 따라서, 데이터베이스는 일반적으로 하나 개의 값으로 그 값을 여러 개 만드는 방법을 정확하게 말 할 필요가있다. 일반적으로,이는 COUNT와 같은 집계 함수 ()와 함께 이루어집니다, SUM (), MAX () 등 대부분의 다른 인기있는 데이터베이스 시스템이 주장하기 때문에 나는 보통 말한다. 그러나, MySQL은 이전 버전 5.7에 기본 동작은 불평하지 않기 때문에 용서 더했습니다 다음 임의 값을 선택! 그것은 또한 당신이 정말 이전과 동일한 동작을 필요로하는 경우이 질문에 다른 해결책으로 사용 될 수있는 ANY_VALUE () 함수를 가지고있다. 당신이 그것을 필요를위한 아주 좋은 이유가없는 나는 그것을 권하고 싶지 않다 그래서, 비 결정적이기 때문에 이러한 유연성은 비용에 온다. 그것은 가장이 사용하고 쿼리가 준수 할 얻을 그래서 MySQL은 지금, 좋은 이유에 대해 기본적으로 설정 ONLY_FULL_GROUP_BY 온 의존하고 있습니다.

    그런데 왜 내 간단한 대답 위? 나는 가정의 몇했습니다 :

    1) GROUP_ID 유일하다. 합리적인 것 같은데, 모든 후 'ID'입니다.

    2) GROUP_NAME도 독특하다. 이것은 합리적인 가정하지 않을 수 있습니다. 이 경우에 해당하지 않고, 일부 중복 GROUP_NAMES이 있고 후 GROUP BY에 GROUP_ID를 추가 할 내 충고를 따르는 경우에, 당신은 당신이 지금 같은 이름을 가진 그룹이 이제 별도의 행이 있기 때문에 이전보다 더 많은 결과를 얻을 것을 알 수 있습니다 결과. 나에게,이 데이터베이스가 조용히 임의로 값을 선택했기 때문에 숨겨진 이러한 중복기를 갖는 것보다 더 좋을 것입니다!

    또한 포함 된 하나 개 이상의 테이블이있을 때 자신의 테이블 이름 또는 별칭으로 모든 열을 규정하는 것이 좋습니다의 ...

    SELECT 
      g.group_id AS 'value', 
      g.group_name AS 'text' 
    FROM mod_users_groups g
    LEFT JOIN mod_users_data d ON g.group_id = d.group_id 
    WHERE g.active = 1 
      AND g.department_id = 1 
      AND g.manage_work_orders = 1 
      AND g.group_name != 'root' 
      AND g.group_name != 'superuser' 
    GROUP BY 
      g.group_name, 
      g.group_id 
    HAVING COUNT(d.user_id) > 0 
    ORDER BY g.group_name
    
  2. ==============================

    2.당신은 다음을 실행하여 설정 ONLY_FULL_GROUP_BY을 해제 시도 할 수 있습니다 :

    당신은 다음을 실행하여 설정 ONLY_FULL_GROUP_BY을 해제 시도 할 수 있습니다 :

    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';
    

    그 요구 사항이 제거 될 수 있도록 MySQL의 8 NO_AUTO_CREATE_USER을 허용하지 않습니다.

  3. ==============================

    3.다른 답변에 설명 된대로 경고 메시지를 해제 할 수 있습니다 또는 당신은 무슨 일이 일어나고 있는지 이해하고 문제를 해결할 수 있습니다.

    다른 답변에 설명 된대로 경고 메시지를 해제 할 수 있습니다 또는 당신은 무슨 일이 일어나고 있는지 이해하고 문제를 해결할 수 있습니다.

    MySQL은 5.7.5로, 기본 SQL 모드를 사용하면 행을 그룹화하고 해당 그룹의 무언가를 선택할 때, 당신은 명시 적으로 선택이 만든해야하는 행 말할 필요가있는 수단 ONLY_FULL_GROUP_BY을 포함한다.

    MySQL은 알 필요가 당신에게 두 가지 옵션을 제공합니다 당신이 찾고있는 그룹에있는 행

  4. ==============================

    4.당신이 당신의 현재 쿼리에 변경을하지 않으려면 다음 단계 아래를 따라 -

    당신이 당신의 현재 쿼리에 변경을하지 않으려면 다음 단계 아래를 따라 -

  5. ==============================

    5.사용 ANY_VALUE ()는 집계되지 열을 참조합니다.

    사용 ANY_VALUE ()는 집계되지 열을 참조합니다.

    SELECT name,           address , MAX(age) FROM t GROUP BY name; -- fails
    SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name; -- works
    

    MySQL의 5.7 문서에서 :

  6. ==============================

    6.이 오류에 대해 무엇을 설명하려고합니다. MySQL은 5.7.5에서 시작, 옵션 ONLY_FULL_GROUP_BY은 기본적으로 활성화되어 있습니다. 따라서, 따른 SQL92 이전을 STANDART한다 :

    이 오류에 대해 무엇을 설명하려고합니다. MySQL은 5.7.5에서 시작, 옵션 ONLY_FULL_GROUP_BY은 기본적으로 활성화되어 있습니다. 따라서, 따른 SQL92 이전을 STANDART한다 :

    (문서에서 자세한 내용을)

    따라서, 예를 들어 :

    SELECT * FROM `users` GROUP BY `name`;
    

    당신은 위의 쿼리를 실행 한 후 오류 메시지가 표시됩니다.

    왜? MySQL이 정확히 이해 해달라고 때문에, 그룹화 기록에서 어떤 특정한 값을 검색하고,이 지점입니다합니다.

    즉 당신이 당신의 사용자 테이블에서이 기록을 갖고 있다고 할 수 있습니다 :

    그리고 당신은 위의 잘못된 쿼리 showen를 실행합니다. 그리고 그들 모두는 다른 이메일 필드 값을 가지고, 이름을 요한 복음 3 개 기록이 있기 때문에 당신은 위에 표시된 오류가 발생합니다, 그것은 좋은,하지만. 그래서, MySQL은 단순히 그룹화 기록을 결과로 반환하도록 어떤 이해가 안 돼요.

    당신은 단순히 다음과 같이 쿼리를 변경하여이 문제를 해결할 수 있습니다 :

    SELECT `name` FROM `users` GROUP BY `name`
    

    또한, 섹션을 선택하기 위해 더 많은 필드를 추가 할 수 있지만이 집계되지 않은 경우 당신은 그렇게하지 못할,하지만 당신은 (그러나 매우 reccomended하지 않음) 사용할 수있는 버팀목이있다 :

    SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`
    

    지금, 당신은 요청할 수 있습니다, 왜 ANY_VALUE를 사용하는 것은 추천되지 않는 이유는 무엇입니까? MySQL은 정확히 분류 기록의 값이,이 기능을 사용하여 검색 할 무엇을 모르기 때문에, 당신이 그들 중 하나를 가져 오기 위해 그것을 요구 (이름,이 경우 첫 번째 레코드의 이메일을 = 존은 인출했다). 정확히 내가이 동작이 존재 할 이유에 어떤 아이디어를 가지고 올 캔트. 당신이 나를 이해 해달라고하면, MySQL은 작동에 그룹화하는 방법에 대해 자세히 읽어 보시기 바랍니다, 그것은 매우 간단합니다.

    그리고 마지막으로, 여기에 하나 더 간단 아직 유효 쿼리입니다. 사용 가능한 연령에 따라 카운트 쿼리 전체 사용자에게 원하는 경우, 당신은이 쿼리를 기록 할 수 있습니다

    SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;
    

    어떤 MySQL의 규칙에 따라 완전히 유효합니다. 등등. 이 문제는 단지 다음 해결책을 적어 정확히 이해하는 것이 중요합니다.

  7. ==============================

    7.내가 laravel 농가에 Laravel 5.3, MySQL은 5.7.12을 사용하고 (0.5.0, 저는 믿습니다)

    내가 laravel 농가에 Laravel 5.3, MySQL은 5.7.12을 사용하고 (0.5.0, 저는 믿습니다)

    심지어 후 명시 적으로 반영하기 위해 /etc/mysql/my.cnf 편집 설정 :

    [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
    

    난 여전히 오류가 발생했습니다.

    내가 변화했다 설정 / database.php 사실에서 false로 :

        'mysql' => [
            'strict' => false, //behave like 5.6
            //'strict' => true //behave like 5.7
        ], 
    

    추가 읽기 :

    https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel-5-2

  8. ==============================

    8.당신 WAMP 3.0.6이 문제를 직면 할 수있는 안정적인 2.5 이외의 상위 버전을 사용하는 경우, 먼저 문제는 SQL로입니다. 그에 따라 필드의 이름을 지정해야합니다. 하지만 당신은 그것을 해결할 수있는 또 다른 방법이있다. WAMP의 녹색 아이콘을 클릭합니다. mysql-> MySQL의 설정 -> sql_mode-> 없음. 또는 콘솔에서 기본값을 변경할 수 있습니다.

    당신 WAMP 3.0.6이 문제를 직면 할 수있는 안정적인 2.5 이외의 상위 버전을 사용하는 경우, 먼저 문제는 SQL로입니다. 그에 따라 필드의 이름을 지정해야합니다. 하지만 당신은 그것을 해결할 수있는 또 다른 방법이있다. WAMP의 녹색 아이콘을 클릭합니다. mysql-> MySQL의 설정 -> sql_mode-> 없음. 또는 콘솔에서 기본값을 변경할 수 있습니다.

    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';
    
  9. ==============================

    9.파일의 줄 (아래 언급)의 추가 : /etc/mysql/my.cnf

    파일의 줄 (아래 언급)의 추가 : /etc/mysql/my.cnf

    [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
    

    나를 위해 잘 작동. 서버 버전 : 5.7.18-0ubuntu0.16.04.1 - (우분투)

  10. ==============================

    10.MySQL의 또는 phpMyAdmin을 선택하고 데이터베이스로 이동 단순히이 쿼리를 실행하고 그것은 작동합니다. 나를 위해 그 작업을 잘.

    MySQL의 또는 phpMyAdmin을 선택하고 데이터베이스로 이동 단순히이 쿼리를 실행하고 그것은 작동합니다. 나를 위해 그 작업을 잘.

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

    11.Mac 용 :

    Mac 용 :

    기본을 /etc/my.cnf에 내-default.cnf을 1.Copy

    sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf
    

    my.cnf 파일이 좋아하는 편집기를 사용하고있는 2.Change의 sql_mode이로 설정

    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    

    3.Restart MySQL 서버.

    mysql.server restart
    
  12. ==============================

    12.이는 전체 문제를 이해하는 나에게 도움을 것입니다 :

    이는 전체 문제를 이해하는 나에게 도움을 것입니다 :

    그리고에 문제가있는 쿼리의 또 다른 예를 다음과 같습니다.

    문제 :

    SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM `gameplay`
                            WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
                            AND cookieid = #
    

    끝으로이를 추가하여 해결 :

      GROUP BY timestamp, userid, cookieid, questionid, answerid, elapsed, ipaddress
    

    참고 : PHP에서 오류 메시지를 참조하십시오, 그것은 어디에 문제가 거짓말을 알려줍니다.

    예:

    이 경우, 표현 # 4는 GROUP BY에서 누락했다.

  13. ==============================

    13.로컬 호스트 / wampserver 3를 위해 우리는이 오류를 제거하기 위해 SQL 모드 = user_mode을 설정할 수 있습니다 :

    로컬 호스트 / wampserver 3를 위해 우리는이 오류를 제거하기 위해 SQL 모드 = user_mode을 설정할 수 있습니다 :

    click on wamp icon -> MySql -> MySql Setting -> sql-mode -> user_mode
    

    다음 다시 시작 WAMP 또는 아파치

  14. ==============================

    14.당신은 GROUP_ID에 고유 인덱스를 추가 할 수 있습니다; 당신이 확신하는 경우 GROUP_ID는 고유한지.

    당신은 GROUP_ID에 고유 인덱스를 추가 할 수 있습니다; 당신이 확신하는 경우 GROUP_ID는 고유한지.

    이 쿼리를 수정하지 않고 사건을 해결할 수 있습니다.

    늦은 대답은 있지만 답을 아직 언급되지 않았습니다. 어쩌면 이미 포괄적 인 답변을 사용할 완료해야합니다. 내가 너무 많은 필드가있는 테이블을 분할했을 때 적어도 내 사건을 해결했다.

  15. ==============================

    15.당신이 교리 쿼리 빌더를 사용 심포니와 함께이 오류가있는 경우,이 오류가 해 orderBy에 의한 경우 :

    당신이 교리 쿼리 빌더를 사용 심포니와 함께이 오류가있는 경우,이 오류가 해 orderBy에 의한 경우 :

    에주의는 GROUPBY 할 열을 선택하고 대신 GROUPBY의 addGroupBy를 사용합니다 :

    $query = $this->createQueryBuilder('smth')->addGroupBy('smth.mycolumn');
    

    Symfony3에 작품 -

  16. ==============================

    16.정확한 SQL을 사용하지 않는 사과

    정확한 SQL을 사용하지 않는 사과

    나는 MySQL의 경고를 극복하기 위해이 쿼리를 사용했다.

    SELECT count(*) AS cnt, `regions_id`
    FROM regionables 
    WHERE `regionable_id` = '115' OR `regionable_id` = '714'
    GROUP BY `regions_id`
    HAVING cnt > 1
    

    나를 것에 대해 키를주의

    count(*) AS cnt
    
  17. from https://stackoverflow.com/questions/34115174/error-related-to-only-full-group-by-when-executing-a-query-in-mysql by cc-by-sa and MIT license