2017-03-29 5 views
0

I이 쿼리가이 쿼리이상한 결과

SELECT COUNT(1), name, (@i := @i + 1) AS counter FROM mytbl, (SELECT @i := 0) tmp_tbl GROUP BY counter

을 대향 컬럼 2

으로 값이 증가하지만 COUNT를 제거 할 경우 (1), 예컨대 :

SELECT name, (@i := @i + 1) AS counter FROM mytbl, (SELECT @i := 0) tmp_tbl GROUP BY counter

대향 컬럼 1

와 그 값을 증가

아무도 왜이 동작을 설명 할 수 있습니까?


표 것이다 :

MySQL document에서 언급했듯이

INSERT INTO mytbl VALUES ('a1'), ('a2'), ('a3');

+0

문제를 재현하는 데 도움이되는 샘플 데이터가 없으면 문제를 조사하기가 정말 어렵습니다. –

+0

@GiorgosBetsos 편집을 참조하십시오. :) – artaxerxe

답변

1

, 우리는 사용자 변수에 값을 할당하고 내의 값을 판독하지 않아야 데이터 create table mytbl (name VARCHAR(20));

같은 진술. 우리는 예상 된 결과를 얻을 수 있지만 이것이 보장되는 것은 아닙니다. 명령문을 변경 (예 : GROUP BY, HAVING 또는 ORDER BY 절 추가)하면 MySQL이 다른 순서의 평가 순서로 실행 계획을 선택할 수 있습니다.

쿼리에서 카운터 필드는 SELECT 문에서 계산 된 다음 GROUP BY 문에서 사용됩니다. SELECT 문에 집계 함수를 추가하면 GROUP BY 문에서 사용될 필드가 두 번 평가됩니다.

나는 demo을 만들었습니다. 확인해 볼 수 있습니다. 데모에서는, 난 단지 증가이 쿼리 실행 결과에서

SELECT Count(1), 
     name, 
     (@i := @i + 1) AS counter, 
     (@j := @j + 1) AS group_field 
FROM (SELECT 'A' AS name 
     UNION 
     SELECT 'B' AS name 
     UNION 
     SELECT 'C' AS name) mytable, 
     (SELECT @i := 0) tmp_tbl, 
     (SELECT @j := 0) tmp_tbl1 
GROUP BY group_field; 

, 카운터 필드는 1로 증가하고 group_field 카운터 필드를 만들려면 2

증가 할를했습니다 1을 시도해 볼 수 있습니다.