복붙노트

[SQL] MySQL은 : GROUP BY에없는

SQL

MySQL은 : GROUP BY에없는

이 사이트는 결과를 생성하지만, GROUP BY는 두 개의 서로 다른 결과 수를 갖는 SELECT 수와 SELECT 쿼리와 함께. 이는 phpMyAdmin을뿐만 아니라 사이트에 표시되는 오류 가능성이 높습니다.

쿼리 :

SELECT count(DISTINCT `name`) as `numrows` FROM `users` WHERE `verified` = '1'

SELECT `name`, `type`, `language`, `code` FROM `users` WHERE `verified` = '1' GROUP BY `name` ORDER BY `count` DESC LIMIT 0, 25

phpMyAdmin에 다음과 같은 오류를 제공합니다 :

MySQL의 문서를 읽을 때, 나는 내가 해결해야 할 무엇인지 아직 불분명 해요. 나는이 파악 수없는 것.

해결법

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

    1.다음과 같은 방법으로 전체 그룹이 필요합니다 :

    다음과 같은 방법으로 전체 그룹이 필요합니다 :

    SELECT `name`, `type`, `language`, `code` 
    FROM `users` 
    WHERE `verified` = '1' 
    GROUP BY `name`, `type`, `language`, `code` 
    ORDER BY `count` DESC LIMIT 0, 25
    

    SQL92는 select 절에서 (집계 제외) 모든 열이 조항에 의해 그룹의 일부입니다해야합니다. SQL99 조금이 제한을 느슨하게하고, select 절에있는 모든 열이 GROUP BY 절의 기능적 의존해야한다는. 기본적으로 MySQL은에 의해 부분적으로 그룹에 대해 수 있으며,이 비 결정적 답변, 예를 생성 할 수 있습니다 :

    create table t (x int, y int);
    insert into t (x,y) values (1,1),(1,2),(1,3);
    select x,y from t group by x;
    +------+------+
    | x    | y    |
    +------+------+
    |    1 |    1 |
    +------+------+
    

    즉 임의의 y는 그룹 X를 선택한다. 하나는 @@ sql_mode을 설정하여이 동작을 방지 할 수 있습니다 :

    set @@sql_mode='ONLY_FULL_GROUP_BY';
    select x,y from t group by x; 
    ERROR 1055 (42000): 'test.t.y' isn't in GROUP BY
    
  2. ==============================

    2.이 문제를 해결하는 가장 좋은 방법은 표현에 의해 완전한 그룹을 사용, 물론입니다.

    이 문제를 해결하는 가장 좋은 방법은 표현에 의해 완전한 그룹을 사용, 물론입니다.

    그러나 ONLY_FULL_GROUP_BY 주위 작품 GROUP BY에 기존의 MySQL의 확장의 차단 또 다른 해결책이있다.

    SELECT name, 
           ANY_VALUE(type) type,
           ANY_VALUE(language) language,
           ANY_VALUE(code) code 
      FROM users  
     WHERE verified = '1' 
     GROUP BY name 
     ORDER BY count DESC LIMIT 0, 25
    

    ANY_VALUE ()를 명시 적으로 조작 BY의 MySQL의 불완전 그룹에서 암시 적으로 사용하는 것을 선언 - 서버가 선택할 수, 음, 어떤, 값이 돌아갑니다.

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

    3.짜증나는 'ONLY_FULL_GROUP_BY'예을 해제하는 것입니다 위의 또 다른 해결책은 여러 번 언급 이 게시물에 같이 : 안 ONLY_FULL_GROUP_BY

    짜증나는 'ONLY_FULL_GROUP_BY'예을 해제하는 것입니다 위의 또 다른 해결책은 여러 번 언급 이 게시물에 같이 : 안 ONLY_FULL_GROUP_BY

    나는 여러 시간 동안 전체 프로젝트를 리팩토링하지 않으려면이 솔루션은 매우 유용하다고 생각합니다. 그리고 당신은 GROUP BY 목록 아닌 컬럼의 예측할 수없는 값을 걱정하지 않는 경우.

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

    4.쿼리에 대한 그냥 비활성화 엄격.

    쿼리에 대한 그냥 비활성화 엄격.

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

    5.우선은 그런 이유를 보는 것입니다. 다소 생략 그룹화 된 컬럼의 값이 완전히 열거하는 동안 결과에서 (예외없이 각각 하나), 다른 선택된 컬럼의 값 (들) -하지만 코드 캔 : 이전 버전은 우리가 부주의 비트를 할 수 't는 귀하를 대신하는 사람에게 (하지 않음) :

    우선은 그런 이유를 보는 것입니다. 다소 생략 그룹화 된 컬럼의 값이 완전히 열거하는 동안 결과에서 (예외없이 각각 하나), 다른 선택된 컬럼의 값 (들) -하지만 코드 캔 : 이전 버전은 우리가 부주의 비트를 할 수 't는 귀하를 대신하는 사람에게 (하지 않음) :

    - Hey, MYSQL, list the families of the street - but add a first name as well to every row.
    - Okay sir, but shall I use the father's or the mother's or...? I'm a machine, give exact orders!
    

    우리가 다른 컬럼 (들)에 대한 환경 설정이있는 경우 우리가 결정할 수있는 이유, 이제 우리는을 이해. 사용하다

    MAX() AS
    MIN() AS
    etc, works with strings, too
    

    나 정말 모두 같은 있다면, 예를 들어, 그룹화 한 사용과 관련되어있는 집계되지 값 사이의 차이가 없다

    ANY_VALUE() AS
    

    어느 쪽이든, 당신은 MySQL은 "모호"되는 당신이있는 거 알고 알고하지만 당신은 정말 당신이 그룹화 한 (들) 이외의 모든 열에 초점을하지 않을 수 있습니다.

  6. from https://stackoverflow.com/questions/25800411/mysql-isnt-in-group-by by cc-by-sa and MIT license