mysql에서 group by를 통해 최대값을 가진 row 구하기

juunini·2020년 10월 18일
0

시행착오

목록 보기
5/22

쉬운거 아닌가?

나도 직접 당해보기 전까지는 쉬운 문제 아닌가 하고 생각했다.
짤처럼 정말 시시해서 죽고싶어졌다 같은 쉬운 문제로 생각했다.
근데 실제로 해보니 쉽지 않았다.

안되는 예제

예를 들어 이런 테이블에서 seq가 최대값을 가진 row를 구한다고 생각해보자.

idseqname
11low
12middle
13high
210small
220medium
230large

어떻게 구할 것인가?

SELECT		id, MAX(seq) AS seq, name
FROM		exTable
GROUP BY	id

이렇게 하면 될 것 같은데 안된다.
결과는 이렇게 나온다.

idseqname
13low
230small

막막함

그럼 저걸 다시 괄호로 감싸서 밖에서 최대값을 구하려고 해본다거나
ORDER BY 로 정렬해서 빼본다거나
별의 별 생각을 다 해봤지만 해낼 수 없었다.

아니, 쉬운 문제일 줄 알았는데...
그래서 시시해서 죽었냐

어려운 문제를 대하는 태도

도와줘요 구글

결국 쉽지 않다고 인정하고 검색을 시작했다.
그리고 아래 방법으로 해결했다.

SELECT    original.*
FROM      exTable original
LEFT JOIN exTable compare
ON        original.id = compare.id
AND       original.seq < compare.seq
WHERE     compare.id IS NULL;

해석

WHERE 문 보다 ON - AND 문이 먼저 발동되므로
LEFT JOIN 에 의해 seq 필드가 낮은 row에만 compare값이 들어간다는 점을 이용하여
최대값을 가진 row만을 추출해낼 수 있다.

문제점

FROMLEFT JOIN 안에 들어가는 table이 그냥 table이면 좋겠지만,
괄호로 묶고 서브쿼리가 복잡하게 들어가야 하면
FROM 에 한번, LEFT JOIN 에 한번
총 두번 같은 서브쿼리를 써야한다는 문제점이 있다.
그 만큼 쿼리가 길어질 가능성이 존재한다.

어흑

더 아름다운 방법이 있는데 내가 모르고 있는 것 뿐이라면 좋겠다.
더 짧고 간결하고 아름다운 방법은 없는걸까 ㅠㅠ

profile
지상 최강의 개발자 쥬니니

1개의 댓글

comment-user-thumbnail
2021년 12월 7일

SELECT *
FROM exTable
WHERE seq = (Select max(seq) From exTable)

답글 달기