Database

[MySQL] 원하는 컬럼 중복값 제거 후 임의 번호 생성하기

JaeHa.K 2021. 10. 7. 11:40
728x90

처음에는 중복값을 제거하기 위해 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"> 모양이 되었다.

반응형