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 사용하기
라벨:
번호붙이기,
순번,
Development,
MySql,
rownum
피드 구독하기:
댓글 (Atom)
마우스오른쪽이 풀려있었으면 좋았을텐데요..
답글삭제구경만하다갑니다.;;
마우스오른쪽이 풀려있었으면 좋았을텐데요..
답글삭제구경만하다갑니다.;;
where 절에서 초기화 방법을 쓰니 첫번째 조회에서는 결과가 안나오고 두번째부터 결과가 나오는거 같습니다.
답글삭제