우선 DISTINCT에 대해서 설명을 하자면 중복된 결과를 제거하고 하나만 원하고자할 때 쓰이는 문법이다.
예를 들어서 DB에
a, a, a, b, b, c
과 같이 존재할 경우에는
a,b,c만 나오게 된다. -.,- 흔히 COUNT와 엮어서 특정 사용자가 어떤 행동을 했는지 뽑아달라고 할 때 많이 썼던 것 같다.
최근에 약 50만건의 DB에서 중복되지 않게 email들을 뽑아달라는 요청이 왔었다.
그래서 아무 생각없이. 'DISTINCT를 쓰면 되겠구나'라고 생각을 했는데, 음... 결론적으로 말하자면 결과가 별로 좋진 않았다.
테이블을 간략화하자면 다음과 같다.
idx / int / NOT NULL, PK, AUTO_INCREMENT, INDEX
email / varchar(100) / NOT NULL
name / varchar(30) / NOT NULL
동일한 사용자는 여러개의 name(많은 사람은 400개 정도 --;)를 가질 수 있고, 이것을 DISTINCT로 거르자는게 내 생각이었다.
그래서 아무 생각없이
SELECT DISTINCT email FROM table;
로 끝내려고 했는데, 음 캐릭터 이름도 나와야할 것 같아서 캐릭터 이름을 그냥 나중에 뒤로 추가했다.
SELECT DISTINCT email, name FROM table;
그랬더니 왠지 모르게 결과가 많이 늘었지만 (그 당시에는 인지하지 못했다) 무시하고 지나갔는데 오늘 생각해보니 이런 이유였던 것 같다.
SELECT DISTINCT email, name FROM table 에서
DISTINCT는 (email, name) 짝을 하나의 결과물로 묶고 저 두개가 같은 결과들만 쳐낸 것이 아닐까 --; 그럼에도 불구하고 결과가 약 17만건이 줄었던 것이 여전히 충격적이다.
그래서 다음과 같은 경우에는 이제 아래와 같은 방법을 사용하면 될 것 같다...;;
SELECT email, name FROM table WHERE idx in (SELECT DISTINCT email FROM table) ORDER BY idx DESC
만약 저렇게 한다면 최신 캐릭터명으로 이메일들이 1개씩만 나오지 않을까 생각한다 -_-;
mysql만 쓴지 벌써 5년짼데 아직도 이딴 삽질을 하는거 보면 맨날 헛공부를 하는 것 같다.
'study > mysql' 카테고리의 다른 글
mysql 에서 update시 순서대로 값 먹여서 업데이트하기 (mysql sequential numbering update) (0) | 2013.02.20 |
---|---|
mysql select 할 때 순환자 넘버링하기 (iterator numbering) (0) | 2013.02.20 |
PHP + MySQL에서 FETCH 방식에 따른 차이 (1) | 2010.12.26 |