DISTINCT와 GROUP BY를 함께 사용하는 다음 MySQL 쿼리를 보았습니다.

SELECT DISTINCT user_id, post_id, post_content FROM some_table GROUP BY post_id, user_id HAVING post_content LIKE "%abc%"; 

다음은 쿼리와 함께 진행되는 시나리오입니다. 각 사용자는 고유 한 ID 인 user_id를 가지며 고유 ID 인

. 각 게시물에는 일부 텍스트가 포함됩니다.

오라클 DB에서 나온 후 혼란스럽고 다음과 같은 질문이있었습니다.

  1. GROUP BY 집계를 수행하지 않고?
  2. SELECT에서 열 순서를 전환하는 것과 GROUP BY에서 열 순서를 전환하는 것의 중요성은 무엇입니까? ?
  3. GROUP BY에서 세 번째 열을 생략한다는 의미는 무엇입니까?
  4. DISTINCTGROUP BY와 함께 사용 하시겠습니까? 최종 결과에 대해 모든 그룹화가 완료된 후 또는 그 전에 개별 작업이 실행됩니까?

댓글

  • 항목 2 : 의미. GROUP BY는 전혀 문제가되지 않습니다 (이전 버전에서는 동일한 ORDER BY을 의미한다는 점을 제외하고는). SELECT 순서는 출력의 열 배열에서만 중요합니다.

답변

광고 1) 이전 mysql 데이터베이스와 ONLY_FULL_GROUP_BY 를 비활성화하면이 쿼리를 수행 할 수 있으며 post_content가 모두 동일한 경우 mysql이 임의의 결정적이지 않은 값을 반환한다는 것을 알 수 있습니다. .

ad 2) none soever

ad 3) lazy programming 및 ONLY_FULL_GROUP_BY

ad 4) 아니요, user_id에 연결된 모든 post_content를 표시합니다. post_id는 Group by addind post_content와 유사합니다.

Like Strawberry가 이미이 쿼리가 이해하기

답변

이전 버전의 MyS에서 부분 그룹을 허용하는 미친 기능 QL은 IT 업계에서 가장 큰 혼란을 야기하는 가장 큰 경쟁자 중 하나 여야합니다.

표를 보면 :

CREATE TABLE t ( x int not null primary key , y int not null ); INSERT INTO t (x,y) VALUES (1,1),(1,2); 

성명

SELECT x, y FROM t GROUP BY x 

는 (1,1) 또는 (1,2)를 의미 할 수 있으며 MySQL은이 중 하나를 임의로 반환합니다. 이 경우 DISTINCT는 중요하지 않으며 결과는 여전히 결정적이지 않습니다.

SQL92에서는 select 절의 모든 열 (집계 된 열 및 상수 제외)이 GROUP BY 절의 일부 여야합니다.

p>

SQL99는이 제한을 약간 완화하고 나머지 열에 기능적으로 종속 된 GROUP BY에서 열을 제외 할 수 있도록했습니다. 즉

CREATE TABLE t ( x int not null primary key , y int not null ); SELECT x, y FROM t GROUP by x 

는 y가 f.d이기 때문에 유효합니다. of x

놀랍게도 (저에게) 나중 버전의 MySQL은 SQL99 버전을 구현할 때 동급 최고입니다. 최근에 확인하지는 않았지만 MySQL을 사용했을 때 PostgreSQL이 사소한 시나리오 만 처리하는 상당히 복잡한 시나리오를 잘 처리했습니다.

질문에 답하려면

1)

SELECT x, y FROM t GROUP BY x, y 

는 x, y의 조합이 그룹임을 의미합니다. 가능한 모든 상황에서 다음과 같다고 생각할 수 있습니다.

SELECT DISTINCT x, y FROM t 

논리적으로 서로 다른 시간에 평가되기 때문에 실제로 다를 수있는 코너 케이스가있을 수 있습니다 (하지만 하나는 생각할 수 없습니다)

2) 없음 ,이 점에서 열 집합이므로 순서가 없습니다.

3) 위를 참조하십시오.

4) SQL 쿼리의 논리적 평가 순서는 다음과 같습니다.

FROM, JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY FETCH FIRST 

따라서 GROUP BY는 DISTINCT보다 먼저 평가되어야합니다. 이것이 중요한 상황을 생각할 수 없습니다.

귀하의 쿼리에서 누군가 혼란스러운 결과를 얻었거나 DISTINCT를 사용하여 다른 결과를 얻으려고 한 것 같습니다. 예상 했으므로 DISTINCT는 그대로 유지되었습니다. 버그는 여전히 존재합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다