2013년 9월 1일 일요일

[MySQL] rownum을 사용하여 조회된 결과에 번호붙이기



  MySql에서 Oracle에서 처럼 ROWNUM을 구하기 위한 방법을 찾다가 세션변수를 이용한 방법을 찾게 되었습니다.

  @rownum 을 사용하는 방법인데, 
어떻게 활용하는지 알아보겠습니다.

▶ 사용법 1 SET 구문을 사용하여 초기화
▶ 사용법 2 FROM절에서 초기화
▶ 사용법 3 WHERE절에서 초기화
▶ 사용예제
▶ 초기화 구문이 없을 경우
▶ JOIN문이 포함된 경우




  SELECT 구문에 ROW번호를 구하기 위한 수식을 추가합니다.

@rownum:=@rownum+1



▶ 사용법 1 SET 구문을 사용하여 초기화

  SET 구문을 사용하여 조회하기 전에 rownum을 초기화 하고, 데이터를 조회합니다.

SET @rownum:=0;

SELECT
  @rownum:=@rownum+1
FROM 테이블명;


▶ 사용법 2 FROM절에서 초기화

  FROM 절에 rownum을 초기화하는 SUB 테이블을 붙여서 조회합니다.

SELECT
  @rownum:=@rownum+1
FROM 테이블명
         , (SELECT @rownum:=0) TMP;


▶ 사용법 3 WHERE절에서 초기화

  WHERE 절에 rownum을 초기화하는 조건을 붙여서 조회합니다.

SELECT
  @rownum:=@rownum+1
FROM 테이블명
WHERE (@rownum:=0)=0;


▶ 사용예제

SET @rownum:=0;

SELECT
  @rownum:=@rownum+1, CRE_DTM
FROM TB_API_ACCESS_LOG;


SELECT
  @rownum:=@rownum+1, CRE_DTM
FROM TB_API_ACCESS_LOG
, (SELECT @rownum:=0) TMP;


SELECT
  @rownum:=@rownum+1, CRE_DTM
FROM TB_API_ACCESS_LOG
WHERE (@rownum:=0)=0;


위 사용법1,2,3의 예제를 모두 실행해보니, 아래 그림과 같이 모두 동일한 결과값이 나왔습니다.





▶ 초기화 구문이 없을 경우

  만약, 초기화 구문을 넣지않고 @rownum:=@rownum+1 만으로 데이터를 조회하게 된다면, 조회할 때마다 rownum값이 매번 바뀌는 결과가 나타납니다.



그러므로 @rownum:=0 과 같이 rownum 변수를 초기화 해주는 구문을 추가해 주어야 결과값이 정상으로 나타납니다.



▶ JOIN문이 포함된 경우

  사용법2를 사용할 때, FROM 절에 JOIN문이 포함되어 있을 경우, 초기화 구문을 추가하는 두가지 방법이 있습니다.


 ① SUB 테이블 사용하기
   
    (SELECT @rownum:=0) TMP; 을 JOIN문 아래에 추가합니다.

SELECT 
 @rownum:=@rownum+1 AS ROW_NUM
, APPINFO.APP_NM AS APP_NAME  
, CODE.CD_NM AS OS_NAME
, DATE_FORMAT(LOG1.CRE_DTM, '%Y-%m-%d %H:%i:%s') AS CRE_DTM
FROM TB_API_ACCESS_LOG LOG1
LEFT OUTER JOIN TB_SVC_NOTICE_CD CODE ON (LOG1.OS_TYPE = CODE.NOTICE_CD)
LEFT OUTER JOIN TB_SVC_APP_INFO APPINFO ON (LOG1.APPKEY = APPINFO.APP_KEY)
, (SELECT @rownum:=0) TMP


 ② INNER JOIN 을 사용하기

    INNER JOIN (SELECT @rownum:=0) T2 을 조회할 테이블 다음에 추가합니다.

SELECT 
 @rownum:=@rownum+1 AS ROW_NUM
, APPINFO.APP_NM AS APP_NAME  
, CODE.CD_NM AS OS_NAME
, DATE_FORMAT(LOG1.CRE_DTM, '%Y-%m-%d %H:%i:%s') AS CRE_DTM
FROM TB_API_ACCESS_LOG LOG1
INNER JOIN (SELECT @rownum:=0) T2
LEFT OUTER JOIN TB_SVC_NOTICE_CD CODE ON (LOG1.OS_TYPE = CODE.NOTICE_CD)
LEFT OUTER JOIN TB_SVC_APP_INFO APPINFO ON (LOG1.APPKEY = APPINFO.APP_KEY)





참고 : MySQL에서 rownum 사용하기





댓글 3개:

  1. 마우스오른쪽이 풀려있었으면 좋았을텐데요..
    구경만하다갑니다.;;

    답글삭제
  2. 마우스오른쪽이 풀려있었으면 좋았을텐데요..
    구경만하다갑니다.;;

    답글삭제
  3. where 절에서 초기화 방법을 쓰니 첫번째 조회에서는 결과가 안나오고 두번째부터 결과가 나오는거 같습니다.

    답글삭제