2016-11-17 1 views
3

ImSuite 5.7의 작동 방식을 이해하려고합니다. 쿼리에서SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1055 식 # 2

 SELECT 
     r.*, 
     CONCAT(u.fname, ' ', u.lname) AS name 
     FROM 
     `events` AS r 
     LEFT JOIN `users` AS u 
      ON r.user_id = u.id 
     WHERE r.event_id = 1 
     GROUP BY r.user_id 
     ORDER BY r.date ; 

우는 내가 오류를 받고 있어요 "SELECT 목록에 GROUP BY 절에없는 및 GROUP BY 절에서 컬럼에 기능적으로 의존하지 않는 집계되지 칼럼 'r.id'를 포함, 이것은와 호환되지 않습니다 sql_mode = ONLY_FULL_GROUP_BY [코드 : 42000] "

그러나이 같은 쿼리

잘 작동 : 나는 로컬 호스트에서 일하고 있어요 때문에

SELECT 
     r.id, 
     r.event_id, 
     r.user_id, 
     r.date 
     CONCAT(u.fname, ' ', u.lname) AS name 
     FROM 
     `events` AS r 
     LEFT JOIN `users` AS u 
      ON r.user_id = u.id 
     WHERE r.event_id = 1 
     GROUP BY r.user_id, r.event_id, r.id, r.date 
     ORDER BY r.date ; 

, 나는 파일의 my.ini의 변경 및 설정 sql_mode을 만들 수있다"STRICT_ALL_TABLES을 , ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER "

그러나 라이브가되면 많은 사람들이 공유 호스팅에서 my.ini 파일에 액세스하지 않으므로 문제가 될 것입니다.

모든 비트 필드를 선언하고 이에 따라 집계하는 것이 비효율적 인 것 같습니다.

MySql에 대한 지식이 초보자이므로 위의 쿼리를 작성하는 더 좋은 방법이 있습니까? 하나의 테이블에서 10 개 또는 20 개의 필드를 가져와야 할 경우 모두를 모으는 것이 어리석은 것처럼 보입니다.

답변

1

개념은 당신이 집계 함수에 관련된 모든 컬럼에 의해 그룹에서

당신의

SELECT 
    r.id, 
    r.event_id, 
    r.user_id, 
    r.date 
    CONCAT(u.fname, ' ', u.lname) AS name 
    FROM 
    `events` AS r 
    LEFT JOIN `users` AS u 
     ON r.user_id = u.id 
    WHERE r.event_id = 1 
    GROUP BY r.user_id, r.event_id, r.id, r.date 
    ORDER BY r.date ; 

처음 당신이에서

SELECT DISTINCT 
    r.id, 
    r.event_id, 
    r.user_id, 
    r.date 
    CONCAT(u.fname, ' ', u.lname) AS name 
    FROM 
    `events` AS r 
    LEFT JOIN `users` AS u 
     ON r.user_id = u.id 
    WHERE r.event_id = 1 
    ORDER BY r.date ; 

에 해당 선언해야합니다 간단합니다 r. *하지만 그룹에 포함되지 않음

+0

OP에 대한주의 사항 : select 절의 집계 함수 'count()','sum()', 등등. 그룹핑의 모든 값을 평가하는 곳이다. – Ray

+0

올바른 concat은 집계 함수가 아닙니다. linear입니다. group_concat은 집계 함수입니다. – scaisEdge

+0

DuH !! 좋은 캐치, 내 코멘트 편집 – Ray

관련 문제