[MySQL] 원하는 컬럼 중복값 제거 후 임의 번호 생성하기
처음에는 중복값을 제거하기 위해 DISTINCT를 사용하여 데이터를 추출했었다.
SELECT DISTINCT c_main FROM category
결과값이다
그런데 넘버링을 해야하는 상황이 생겼고 여러가지 방법을 찾다가 아래와 같은 방법으로 진행하였다.
SELECT @rownum:=@rownum+1 rnum, c.c_main
FROM category c,
(SELECT @ROWNUM:=0)R WHERE 1=1
GROUP BY c_main
ORDER BY rnum ASC
DISTINCT를 고집했지만 결국 한계가 있었고 이를 GROUP BY와 ROWNUM을 활용해 극복했다.
1번째 줄을 통해 rnum이라는 임의의 컬럼과 c_main이라는 category테이블의 컬럼을 추출하였음을 확인할 수 있다.
여기서 rnum은 @rownum이라는 변수와 +1씩 증가한다는 구문을 추가 시켜 번호가 중복없이 생성되게 하는 친구이다.
3번째 줄에서 @ROWNUM이라는 변수의 초기값을 설정해줬다.
4번째 줄에서는 DISTINCT가 해줬던 중복값 제거를 GROUP BY를 사용해 중복값을 제거 해줬고,
마지막으로 5번째 줄에서 rnum을 ORDER BY로 순서대로 뽑아냈다.(순서 사이에 공백이 발생하는 것은 c_main의 총 개수가 12개고 그중에서 중복되는 값의 첫번째 값의 번호만 떠서 그런 것이다. 어찌됬든 난 이 번호가 필요한 거여서 크게 신경 안쓰였다.)
그런데 여기서 사소한 문제가 하나 생겼는데 나는 이걸 jsp에서 class명에 사용하고 싶어서 rnum을 생성했었는데 막상 반복문을 사용해 생성해보니 아이러니하게도 class명이 내가 원했던 <li class="product1"> 모양이 아닌 <li class="product1.0">이 되었다.
DB에서는 1이라고 보였으나 사실은 1이 아니라 1.0이였던 것이다!
크게 상관은 없을 수도 있으나 찝찝했기에 이것을 해결하기 위한 방법으로 CAST를 사용했다.
SELECT CAST(@rownum:=@rownum+1 AS SIGNED integer) rnum, c.c_main
FROM category c,
(SELECT @ROWNUM:=0)R WHERE 1=1
GROUP BY c_main
ORDER BY rnum ASC
integer 타입으로 CAST를 해주고 나니 정상적으로 내가 원하는 모양인 <li class="product1"> 모양이 되었다.