열 값당 1을 선택 하시겠습니까?


11

다음 테이블이 있다고 가정 해 봅시다.

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 2         | awesome       |
| 3         | i hate this   |
| 3         | okay          |
| 6         | this is weird |
| 6         | hello?        |
| 6         | what is it    |
| 9         | how are you   |
| 16        | too slow      |
| 16        | yes           |
| 17        | alrighty      |
-----------------------------

한 줄에 어떻게 하나의 행을 선택할 수 user_id있습니까? 내 결과는 다음과 같습니다.

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 3         | i hate this   |
| 6         | this is weird |
| 9         | how are you   |
| 16        | too slow      |
| 17        | alrighty      |
-----------------------------

효율적인 단일 쿼리로 가능합니까? 아니면 하위 선택이 필요합니까? 어떻게 든 DISTINCT단일 열에서 사용할 수 있습니까?

답변:


9

그것이 GROUP BY사용되는 것입니다. 그룹당 한 행을 가져옵니다. 이 경우, 모든 구별 표시됩니다 user_id값과 열의 나머지, 당신은 (해야 할) 수와 같은 집계 함수를 사용하여 MIN(), MAX(), AVG(), SUM()당신이 그룹 당 하나 개 이상의 값을 가질 것이다 하나만 표시 할 수있다.

SELECT
    user_id
  , MIN(comment) AS comment  -- it will show the first in alphabetical order  
                             -- you could also use MAX()
FROM
    tableX
GROUP BY
    user_id ;

MySQL은 또한 다음과 같은 정통 솔루션을 허용합니다.이 솔루션은 사용자 당 하나의 (임의의) 임의의 주석을 반환합니다.

SELECT
    user_id
  , comment
FROM
    tableX
GROUP BY
    user_id ;

이 마지막 쿼리는 작동하지 않지만 (엄격한) ONLY_FULL_GROUP_BY모드가 활성화 된 경우 오류가 발생합니다 . 최근에 출시 된 5.7 버전에서는이 모드가 기본값이며 새로운 기능 ANY_VALUE()인가 제공됩니다. 자세한 내용은 MySQL 처리GROUP BY 페이지를 참조하십시오. 이제 쿼리를 작성할 수 있습니다 :

SELECT
    user_id
  , ANY_VALUE(comment) AS comment
FROM
    tableX
GROUP BY
    user_id ;

"정통 (unorthodox)"버전이나 최근 ANY_VALUE()함수를 사용하여 SELECT목록 에 더 많은 열을 추가 하면 같은 그룹의 행에서만 값이 동일하지는 않습니다. 그들이 선택되는 방법은 정확히 무작위가 아니며 실행 계획과 사용 된 인덱스에 따라 다릅니다.


user_id에 대해 가져올 행을 지정하는 다른 방법이 있습니까? ORDER BY 종류를 지정하는 방법이 있습니까?
Jake Wilson

게다가 MINMAX?
ypercubeᵀᴹ

1
그렇다면 더 복잡합니다. 이 다른 질문을보십시오 : MySQL Query-가장 최근 인구 통계를 얻는 방법?
ypercubeᵀᴹ

2
또한 SO 사이트에서 [greatest-n-per-group]태그 아래에 비슷한 문제가 많이 있습니다 .
ypercubeᵀᴹ September

1
@ T.BrianJones SELECT 목록에 다른 모든 열을 추가하는 경우 "정통"쿼리를 의미합니까? 첫 번째입니다. 같은 행에 있지 않을 수도 있습니다. 정확히 임의의 것은 아니지만 값은 동일한 그룹의 다른 행에서 나올 수 있습니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.