MySQL을 사용하여 여러 열을 그룹화 할 수 있습니까?


206

GROUP BYMySQL SELECT쿼리 에서 둘 이상의 열 이 가능 합니까? 예를 들면 다음과 같습니다.

GROUP BY fV.tier_id AND 'f.form_template_id'

3
행별로 그룹화 할 수 없습니다. 당신은 할 수 있지만 열 그룹화
조 필립스


1
여러 group by 절을 사용하는 대신 하위 쿼리를 수행해야 할 수도 있습니다.
Adam F

투표율이 높은 대부분의 답변은 본질적으로 서로 동일하지만 (올바른 구문을 표시하고 두 열의 순서를 전환하는 효과를 설명합니다) 필요가 약간 다른 경우 Daniklad의 답변을 고려 하십시오 .
ToolmakerSteve

답변:



107

예, 여러 열로 그룹화 할 수 있습니다. 예를 들어

SELECT * FROM table
GROUP BY col1, col2

결과는 먼저 col1별로 그룹화 된 다음 col2별로 그룹화됩니다. MySQL에서는 열 기본 설정이 왼쪽에서 오른쪽으로 이동합니다.


5
왼쪽에서 오른쪽의 기본 설정은 열 그룹 기본 설정이 아닌 그룹의 오름차순에 적용됩니다. GROUP BY적용 col1+col2합니다. 예를 들어 col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2달리기 GROUP BY col1,col2는 제안 된 1,1|1,3|2,2것과 반대로 돌아올 것 1,1|2,2입니다. 반면 GROUP BY col2, col1에 col2 리턴의 오름차순을 변경합니다. 1,1|2,2|1,3 데모 : sqlfiddle.com/#!9/d5f69/12,2 열이 반전 되더라도 행 ID : 2가 두 경우 모두 반환됩니다 .
fyrye

하나 더 테스트. sqlfiddle.com/#!9/5c8763/2 결론. 처음에는 mysql이 정의 된 첫 번째 열을 기준으로 정렬합니다 GROUP BY. 그리고 첫 번째 정의 된 열에 동일한 결과가있는 경우 동일한 결과 내에서만 두 번째 정의 된 열을 기준으로 정렬됩니다
user2360831

SUMwith를 사용하는 것과 관련 하여 GROUP BY. GROUP BY하나의 열만 사용하는 경우 SUM각 고유 (서로 다른) 열 값 sqlfiddle.com/#!9/1cbde2/2 의 모든 값입니다 . GROUP BY열 이 두 개인 경우 그런 다음 mysql은 처음에 첫 번째 열 값이 두 번째 열에 다른 값이 있는지 확인합니다. 그렇다면 mysql SUM은 두 번째 열 sqlfiddle.com/#!9/1cbde2/1 의 각기 다른 값입니다 .
user2360831

23

예,하지만 두 개의 열을 기준으로 그룹화한다는 것은 무엇을 의미합니까? 음, 행당 각 고유 쌍별로 그룹화하는 것과 같습니다. 열을 나열하는 순서는 행 정렬 방식을 변경합니다.

귀하의 예에서는

GROUP BY fV.tier_id, f.form_template_id

한편, 코드

GROUP BY f.form_template_id, fV.tier_id

비슷한 결과를 제공하지만 다르게 정렬됩니다.



13

간단한 예를 사용하기 위해 사이트의 방문 페이지 당 고유 한 IP 주소를 요약해야하는 카운터가있었습니다. 기본적으로 페이지 이름과 IP로 그룹화됩니다. DISTINCT와 GROUP BY의 조합으로 해결했습니다.

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;

2
이 답변은 다른 답변과 다소 다른 문제를 해결하므로 주목할 가치가 있습니다.
ToolmakerSteve

5

동시에 두 열로 그룹을 선호하는 경우 (이 점을 적용해야 함)이 점을 보았습니다.

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1

1
lada의 답변 아래 ypercube의 의견을 참조하십시오. 대안으로 고려하십시오 : SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. 결과는 보통 것 보면 이 대답과 동일하지만 내부 실행은 매우 다르다.
ToolmakerSteve

-2
GROUP BY CONCAT(col1, '_', col2)

37
질문에 답변 한 지 4 년이 지난 후 한 줄의 코드로 답변이 8 (8!) 공감을 얻는 방법이 궁금합니다. 늦고 짧으며 부정확하고 비효율적입니다.
ypercubeᵀᴹ

8
@ ypercubeᵀᴹ 왜 틀렸다고하나요? 이것은 내가 찾던 것과 "group by multiple columns"의 올바른 해석입니다. 사실, 이것이 왜 내가 예상했던 것처럼 "group by col1, col2"의 행동이 아닌지 모르겠습니다
Abram

3
@Abram이 핑을 보내므로 NeverEndingQueue에 대한 회신이 표시됩니다. 단점 :보다 훨씬 덜 효율적 GROUP BY col1, col2입니다. 일부 데이터에는 잘못된 결과가 나타납니다. 한 행과 다른 행에 col1, col2값이 있다고 가정하십시오 . 이 잘못된 대답은 GROUP BY CONCAT을 사용하여 두 행을 하나로 집계합니다. 정답은 없습니다. ('a_b', 'c')('a', 'b_c')
ypercubeᵀᴹ

1
필요한 경우 SELECT 목록에서 CONCAT 표현식을 사용하는 것을 SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
아무도 막을

1
@ ypercubeᵀᴹ oops, 바보 같이 나는 "group by foo, bar"가 "... group by foo union ... group by bar"처럼 행동한다고 ​​생각했다. 실제로 GROUP BY CONCAT에서는 드문 경우입니다.
Abram
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.